2012-05-10 1 views
1

В моем приложении необходимо выполнить несколько веб-сервисов в async-задаче и вставить большие данные в разные таблицы в базе данных с каждым ответом, для каждой таблицы быстро вставлять iam, блокируя базу данных, начинать и конец транзакций. проблема заключается в том, что после всех веб-сервисов, если я пытаюсь вставить новую запись, отображаются логи. Ошибка 5 (база данных заблокирована). Я проверил, заблокирована ли база данных inTransaction(), isDbLockedByOtherThreads и isDbLockedByCurrentThread. все возвратили false.Android Failure 5 (база данных заблокирована) issue

как решить это.

ответ

1

Sqlite не разрешает одновременную запись и по умолчанию при выполнении записи попытка выполнить другую транзакцию не будет выполнена с этой ошибкой. В C API есть функция, чтобы повторить попытку с короткими снами между ними (set_busy_timeout) за указанное время, но я не вижу подобного API в оболочке Android Java, поэтому вам, вероятно, придется обрабатывать повторную попытку эту ошибку самостоятельно.

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

isDbLockedByOtherThreads возвращает false, возможно, либо потому, что другая транзакция заканчивается, прежде чем вы ее вызываете, либо начинаете только после того, как вы это делаете, или просто потому, что она действительно не знает, так как мне неизвестна какая-либо функция для выполнения этой проверки на C уровень.

Существует также аналогичная ошибка, которая возникает, если вы хотите изменить таблицу и иметь незавершенный оператор, ссылающийся на нее, но это статус 6 (таблица заблокирована).

+0

Я пишу и читаю данные двумя разными потоками одновременно, как вы думаете, это причина блокировки базы данных. Специально я использую суставы для сбора данных из разных таблиц. – Kishore

+0

@Kishore: Да, это определенно причина блокировки базы данных. Если база данных не находится в режиме [WAL] (http://www.sqlite.org/wal.html), ** чтение не разрешено во время записи ** (за исключением транзакции). Я не уверен, что Android поддерживает поддержку режима WAL; вы можете попробовать [включить его] (http://www.sqlite.org/pragma.html#pragma_journal_mode) и посмотреть. Это позволит читать, пока транзакция записи выполняется (за исключением операции с контрольной точкой), но допускается только один писатель за раз. –

Смежные вопросы