У меня есть приложение, которое я могу вставить данные в базу данных 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, но я должен признать, что это немного большой для меня.
Какие-нибудь указатели на "лучший" способ делать вещи?
И можетЯ узнаю, что блокирует базу данных?
Спасибо, Саймон