Android - База данных заблокирована - PullRequest
4 голосов
/ 16 января 2011

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

У меня есть множество действий со ссылкой на их собственный SQLiteOpenHelper и их собственный объект SQLiteDatabase.

Приложение работало довольно хорошо, но одно из основных обновленийприложения, которые я решил, нуждались в теме диалога прогресса - это еще одна тема, но если вы можете сказать мне, как я могу заставить вращаться вертеть, это было бы здорово.Однако он отображает.

Но чтобы отобразить его, мне нужно было поместить его в поток.

Создавая этот поток, я начал получать множество сообщений "база данных заблокирована" вЖурнал.

Я подумал, что проблема может быть связана с тем, что у меня в фоновом режиме выполнялась задача каждые шестьдесят секунд - хотя визуально для обновления потребовалась всего пара секунд, поэтому я поместилосновные транзакции записи для функции обновления в блоке beginTransaction.Это единственное место, где я использовал один.

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

Это побудило меня провести некоторую уборку, но, кажется, после того, как я выполнил первую команду beginTransaction, все дальнейшие изменения базы данных, которые я хочу сделать, не срабатывают с сообщением о том, что база данных заблокирована, несмотря на то, что я вызываю db.close.Я даже закрываю вспомогательный объект базы данных и курсор, чтобы быть на безопасной стороне.

Мне удалось очистить большинство предупреждений относительно открытых курсоров, например,

E/Database(  678): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

Я не мог понять, что блокировало базу данных, так как все было закрыто.

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

E/Database( 1304): Failure 5 (database is locked) on 0x26e5d8 when executing 'INSERT INTO

Можно ли выяснить, что блокирует базу данных?Я вижу, что ворчит о блокировке, но не то, что ее блокирует.

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

Какие-нибудь указатели на "лучший" способ делать вещи?

И можетЯ узнаю, что блокирует базу данных?

Спасибо, Саймон

Ответы [ 2 ]

2 голосов
/ 11 октября 2012

класс NAME расширяет SQLiteOpenHelper

добавить:

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
      if (!db.isReadOnly()) {
          db.execSQL("PRAGMA foreign_keys=ON;");
          Cursor c = db.rawQuery("PRAGMA foreign_keys", null);
             if (c.moveToFirst()) {
                 int result = c.getInt(0);
             }
             if (!c.isClosed()) {
                    c.close();
             }        
      }
}
0 голосов
/ 18 января 2011

Вы можете посмотреть на последнюю версию Berkeley DB в качестве опции.Он предоставляет SQLite3-совместимый SQL API (так что ваше приложение может остаться прежним) и обеспечивает более тонкую степень детализации блокировки и, следовательно, лучший параллелизм.Berkeley DB поддерживает несколько одновременных потоков чтения и записи для одновременного активного доступа к базе данных.Вы можете узнать дополнительную информацию о Berkeley DB на нашем сайте .

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