SQlite: База данных заблокирована ошибка - PullRequest
1 голос
/ 14 декабря 2011

Я использую архитектуру SOA для своего приложения для Android. Я постоянно запускаю службу в фоновом режиме (через каждую 1 минуту), которая извлекает данные из моей базы данных MYSQL и синхронизирует их с моей базой данных SQLite (если есть изменения в 2 базах данных).

Теперь, когда служба работает в фоновом режиме, она открывает SQLite. В то же время, если я обрабатываю (использую) приложение, оно также пытается открыть Sqlite для извлечения данных. В этом случае я получаю сообщение об ошибке: База данных заблокирована в android.database.SQLiteOpenHelper.getReadableDatabase.

Может кто-нибудь предложить мне, что можно сделать в такой ситуации?

Ответы [ 4 ]

2 голосов
/ 14 декабря 2011

Я предпочитаю использовать ContentProvider здесь.

Несмотря на то, что он в основном предназначен для совместного использования между приложениями, он может использоваться внутри нашего отдельного приложения.

Если мы используем контент-провайдера, не стоит беспокоиться о закрытии и блокировке БД.

См. Простой поставщик контента для операций с БД

1 голос
/ 14 декабря 2011

Вам необходимо разделить одно соединение с базой данных между вашим приложением и фоновой службой. Это позволит правильно сериализовать все обращения к базе данных.

0 голосов
/ 14 декабря 2011

Это не так, SQLite 3 поддерживает несколько соединений, и вы можете оставить их открытыми. Обязательно используйте транзакцию в потоке обновления и закройте ее как можно скорее.

Читайте об этом в http://www.sqlite.org/lockingv3.html

Если вы используете Python, вы можете, например, установите параметр timeout при подключении к БД, что гарантирует, что поток считывателя будет ждать до истечения времени ожидания, прежде чем сдаться. Поэтому важно сделать программу обновления настолько компактной, насколько это возможно, чтобы у читателя не было тайм-аута.

http://docs.python.org/library/sqlite3.html

Кроме того, я настоятельно рекомендую следующую книгу, если вы хотите узнать больше. Полное руководство по SQLite: http://www.apress.com/9781590596739

0 голосов
/ 14 декабря 2011

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

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

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

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