Подтвердить что ты не робот

База данных Android заблокирована

Я получаю следующую ошибку. Итак, как мне разблокировать мою базу данных?

10-28 08:43:26.510: ERROR/AndroidRuntime(881): FATAL EXCEPTION: Thread-11
10-28 08:43:26.510: ERROR/AndroidRuntime(881): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:742)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at com.aa.me.vianet.dbAdapter.DbAdapter.open(DbAdapter.java:25)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at com.aa.me.vianet.services.NotificationManagerThread.run(NotificationManagerThread.java:49)
4b9b3361

Ответ 1

Я думаю, что вы забыли закрыть базу данных, или другой поток пишет в базу данных, когда вы пытаетесь ее написать. SQLite блокирует базу данных, когда она пишет ей, чтобы избежать повреждения, если другой объект пытается записать в одну и ту же базу данных одновременно. Android, будет отображаться только ошибка в log cat, и запрошенный вами запрос будет просто забыт...

Итак, я рекомендую:

  • Вы получаете доступ только к базе данных с одного SQLOpenHelper
  • Вы завершаете все экземпляры помощников базы данных, как только вы закончите с ними.
  • Вы всегда завершаете транзакции с помощью endTransaction() также, если вы не установите их успешно (то есть, если вы хотите перевернуть их назад), если вы используете транзакции
  • Вы можете попробовать использовать OrmLite, я не использовал его, но я слышал, как другие здесь обманывают.

Ответ 3

Причина, по которой это происходит, состоит в том, что вы можете иметь только одно подключение к базе данных, открываемое одновременно (это значит, чтобы предотвратить условия гонки при изменении базы данных). Я предполагаю, что вы несколько раз подключаетесь к своей базе данных из разных потоков? Самый простой способ обойти это - просто создать ContentProvider для вашей базы данных. Это позволит обрабатывать запросы из нескольких потоков.

Для получения дополнительной информации ознакомьтесь с этим blogpost.

Ответ 4

У меня была та же проблема, попробуйте использовать

   db.beginTransactionNonExclusive();
   try {
       //do some insertions or whatever you need
       db.setTransactionSuccessful();
   } finally {
       db.endTransaction();
   }

Я попытался с db.beginTransaction, но он заблокировал bd

Ответ 5

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

Ответ 6

У меня была та же проблема, что и при попытке доступа к моей базе данных через ContentResolver, пока у меня уже было прямое подключение SQLiteDatabase к ней (требуется для транзакций).

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

Я также удалил некоторый код, поэтому я больше не закрываю свой прямой SQLiteDatabase.

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