Android одновременных операций с БД - «база данных заблокирована» - PullRequest
3 голосов
/ 29 ноября 2010

Я пишу приложение с «онлайн-режимом», то есть данные загружаются, анализируются и вставляются в базу данных SQLite по мере необходимости.Все это выполняется службой.Приложение состоит из нескольких действий, которые запрашивают у службы обновление данных (различные данные зависят от действия).

Когда пользователь перемещается по действиям (не дожидаясь завершения службы), очень легко выполнитьget SQLiteExceptions (сообщение: база данных заблокирована ).

Я думал об использовании синхронизированных блоков, но это заставило бы пользователя ждать при загрузке нового действия (чтодля загрузки требуется доступ к базе данных), пока служба завершает обновление.Так что это кажется тупиком.

Другой вариант может быть остановить обновление в методе onStop каждого действия.Конечно, обновление будет прервано, но это не большая проблема.Проблема в том, что я не уверен, как к нему подойти.

Мой вопрос: как я могу / должен справиться с этим?

1 Ответ

7 голосов
/ 30 ноября 2010

Если ваша деятельность будет только читать, а не записывать в базу данных, как в моем случае, это то, что я сделал в качестве обходного пути:

  • создайте сервис (то есть DatabaseService 0 и используйте его какцентральная точка доступа к базе данных (т. е. открыть соединение с базой данных), чтобы гарантировать, что у вас есть только один dbhelper за один раз.
  • все действия и службы, которым требуется доступ к базе данных, должны устанавливать соединение с DatabaseService
  • убедитесь, что только поток вашего DownloadService может выполнять запись в базу данных, и он должен использовать транзакцию
  • , после этого вы можете использовать базу данных getReadable для чтения / использовать соединение для остановки службы загрузки и т. д.

Просто убедитесь, что вы используете только 1 dbhelper.

...