Я до сих пор не обернулся вокруг синхронизации. Я знаю, что он есть, я знаю, почему он используется и в чем заключается идея, но мне не хватает практических навыков и реальных примеров, чтобы понять, как именно это работает и как это реализовано, когда несколько активистов пытаются читать / записывать в базу данных в то же время. Разделяете ли вы свои объекты через приложение, или система достаточно умна, чтобы синхронизировать различные объекты одного типа?
Возможно, контент-провайдер - лучший путь, насколько я понимаю, со встроенной синхронизацией.
Хотя я отвлекся.
Я все еще не уверен в работе с базой данных. Помните, что у меня есть служба, работающая каждые 60 секунд в фоновом режиме, читающая ту же таблицу, в которую пишет функция обновления. Да, я хочу это изменить, но сейчас я хочу лучше понять работу с базами данных в Android и понять, что происходит.
Если у меня есть цикл, такой как:
db = provider.getReadableDatabase();
while(theres_still_work_today) {
do_some_calculations;
update_database;
}
provider.close();
это прекрасно работает как автономный. Если я попытаюсь поместить это в поток, я получу много ошибок о блокировке. Но когда бегаешь так:
while(theres_still_work_today) {
do_some_calculations;
db = provider.getReadableDatabase();
provider.close();
update_database;
}
Я нахожу это странным, на самом деле это кажется быстрее и не дает проблем с блокировкой.
Мне просто невероятно повезло, что я не получаю два события, которые срабатывают одновременно, вызывая блокировку? Есть ли какой-то тайм-аут, встроенный в обработку базы данных в Android / SQLite?
Я не понимаю, почему последний бит кода должен работать нормально, и почему он должен работать быстрее?
Хотя я не совсем уверен в эмуляторе Android. Если я использую первый вариант с одним открытием / закрытием вне цикла, иногда я могу пройти через длинный длинный цикл, даже если служба запускается в фоновом режиме.
В других случаях происходит сбой прихоти.
Я также не знаю, почему "isDatabaseLockedByOtherThreads ()" не сообщает, что он заблокирован другими потоками.
Любой совет?
Спасибо
Simon