Android数据库已锁定

时间:2011-10-28 13:50:25

标签: 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)

8 个答案:

答案 0 :(得分:38)

我认为您忘记关闭数据库,或者当您尝试写入数据库时​​,另一个线程正在写入数据库。 SQLite在写入数据库时​​将其锁定,以避免在另一个实体同时尝试写入同一数据库时发生损坏。 Android,只会在log cat中显示错误,而您提供的查询将被遗忘...

所以,我建议:

  • 您只能从一个SQLOpenHelper
  • 访问数据库
  • 确保在完成数据库帮助程序后关闭所有数据库帮助程序实例
  • 如果您没有成功设置(例如,如果您想要回滚),请确保始终使用endTransaction()结束交易,以防您使用交易
  • 您可以尝试使用OrmLite,但我没有使用它,但我听到其他人对此赞不绝口。

答案 1 :(得分:13)

在整个应用中使用单个连接。见这里:

http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

答案 2 :(得分:8)

发生这种情况的原因是因为您一次只能打开一个数据库连接(这是为了防止在修改数据库时出现竞争条件)。我猜你从不同的线程多次连接到你的数据库?解决此问题的最简单方法是为数据库创建ContentProvider前端。这将能够处理来自多个线程的查询。

有关详情,请查看此blogpost

答案 3 :(得分:5)

我遇到了同样的问题,请尝试使用此

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

我尝试使用db.beginTransaction但它锁定了bd

答案 4 :(得分:0)

我有类似的错误。我的问题是我不小心给了两个辅助类的数据库同名,因此他们最终同时访问了同一个数据库。因此,请确保您没有访问具有多个帮助程序类的单个数据库。

答案 5 :(得分:0)

我遇到了与尝试通过ContentResolver访问我的数据库相同的问题,而我已经有一个直接的SQLiteDatabase连接(事务需要)。

我通过更改代码的顺序解决了这个问题,因此在我的直接ContentResolver连接打开之前完成了SQLiteDatabase内容。

我还删除了一些代码,因此我不再关闭直接SQLiteDatabase

值得一读this answer,因为它提供了许多其他有用的指导。

答案 6 :(得分:0)

就我而言,此错误是由于常见错误引起的。最初,我的SQLite数据库由从MySQL的JsonArray接收的数据填充。在SQLite数据库中添加其他列后,发生了类似的错误。简而言之,我忘了在MySQL数据库中添加相应的列。。:)

答案 7 :(得分:0)

当我们被抛出如下错误时我们可以做些什么。

<块引用>

android.database.sqlite.SQLiteDatabaseLockedException:数据库是 锁定

数据库锁意味着数据库正在与其他一些线程一起执行任务,同时其他线程在该任务发生时执行。

所以我的解决方案是:

在数据库中执行查询或进行事务之前必须检查 像这样。

if(!sqLiteDatabase.isDbLockedByCurrentThread() && !sqLiteDatabase.isDbLockedByOtherThreads())