Поведение блокировки базы данных Android - PullRequest
3 голосов
/ 26 января 2011

Я до сих пор не обернулся вокруг синхронизации. Я знаю, что он есть, я знаю, почему он используется и в чем заключается идея, но мне не хватает практических навыков и реальных примеров, чтобы понять, как именно это работает и как это реализовано, когда несколько активистов пытаются читать / записывать в базу данных в то же время. Разделяете ли вы свои объекты через приложение, или система достаточно умна, чтобы синхронизировать различные объекты одного типа?

Возможно, контент-провайдер - лучший путь, насколько я понимаю, со встроенной синхронизацией.

Хотя я отвлекся.

Я все еще не уверен в работе с базой данных. Помните, что у меня есть служба, работающая каждые 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...