Работа с sqlite «база данных заблокирована» ошибки в Android - PullRequest
2 голосов
/ 12 мая 2011

У меня есть приложение, в котором время активной работы с базами данных.Время от времени я получал SQLite «база данных заблокирована» ошибки, приводящие к SQLiteExceptions.Пока я пытался использовать:

if((!db.isDbLockedByCurrentThread())&&(!db.isDbLockedByOtherThreads())) {

перед использованием сохранения или вставки, но это не удалось.Итак, я настроил следующее в классе, например.MyApplication, которая расширяет приложение следующим образом:

private AtomicBoolean writingToDataBaseFlag = new AtomicBoolean(false);

с аксессором:

public AtomicBoolean getWritingToDataBaseFlag() {
    return writingToDataBaseFlag;
}

и каждый раз, когда я хочу выполнить вставку или сохранить, я делаю что-то вроде этого:

boolean succeeded = false;
while(!succeeded) {
   if(application.getWritingToDataBaseFlag().compareAndSet(false, true)) {
       if((!db.isDbLockedByCurrentThread())&&(!db.isDbLockedByOtherThreads())) {
           if(!activity.isFinishing()) {
               set_id(db.insert(SDIGENRE, SDIID, cv));
           }
       }
       application.getWritingToDataBaseFlag().compareAndSet(true, false);
       succeeded = true;
    } else {
    // Wait 100 millis
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Это, кажется, работало довольно долгое время.

  1. Это правильный способ обойти эту проблему?
  2. Я начал видеть этиопять ошибки;Есть ли какой-нибудь совет, как отладить эту проблему?

Спасибо за любую помощь, Юлий.

Ответы [ 2 ]

1 голос
/ 16 августа 2012

В итоге у меня был один экземпляр моего DbHelper (SQLiteOpenHelper), привязанный к моему приложению.Делая все звонки через это, у меня никогда не было проблем с параллелизмом.

0 голосов
/ 20 ноября 2014

хорошо, у меня есть доступ к информации.и найдите одну интересную статью о потоке. Управляйте базой данных.

В документации для Android сказано: isDbLockedByOtherThreads () устарела после API 16. Всегда возвращает false.Не используйте этот метод.

, поэтому проблема возникает из isDbLockedByCurrentThread ();

API-интерфейс Android сообщил о методе:

Возвращает true, если текущий поток содержитактивное соединение с базой данных.

Название этого метода происходит от того времени, когда активное соединение с базой данных означало, что поток удерживал фактическую блокировку базы данных.В настоящее время больше не существует настоящей «блокировки базы данных», хотя потоки могут блокироваться, если они не могут получить соединение с базой данных для выполнения определенной операции.

На самом деле, когда вы вставляете, удаляете, изменяете в sqlitedatabase в androidрамки это все об одном потоке.это означает, что когда вы используете два или более потока Управляйте (вставляйте, удаляйте, изменяйте) sqlitedatabase, он будет выдавать ошибки «база данных заблокирована»;

Но вы можете открыть многопоточность, чтобы поставить в очередь ту же sqlitedatabase, это не будетесть какие-либо проблемы

Кстати, если вы хотите очереди, когда вы сдаете вставку;Вы должны использовать

getWritableDatabase().enableWriteAheadLogging();

, он работает только на Android 3.0 или выше;

Возможно, вам следует прочитать эту статью (Если вы умеете читать по-китайски, ха-ха): http://tech.techweb.com.cn/thread-621414-1-1.html

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