Android数据库已锁定

问题描述 投票:35回答:7

我遇到以下错误。那么如何解锁数据库?

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)
android
7个回答
41
投票
我认为您已经忘记关闭数据库,或者在尝试写入数据库时​​另一个线程正在写入数据库。 SQLite在数据库写入数据库时​​将其锁定,以避免在另一个实体尝试同时写入同一数据库时损坏数据库。 Android,只会在log cat中显示一个错误,而您提供的查询将被遗忘...

所以,我建议:

    您只能从一个SQLOpenHelper访问数据库
  • 完成后,请确保关闭数据库帮助器的所有实例
  • 如果您未成功设置交易(例如,如果您想回退交易,则要确保回退),请确保也始终以endTransaction()结束交易
  • 您可以尝试使用OrmLite,我没有使用过,但是我听说这里有人对此赞不绝口。

15
投票
在整个应用中使用单个连接。看到这里:

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


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

有关更多信息,请检出此blogpost


5
投票
我有相同的问题,请尝试使用此

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

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

0
投票
我有类似的错误。我的问题是,我不小心为两个帮助程序类的数据库赋予了相同的名称,因此它们最终导致同时访问同一数据库。因此,请确保您没有访问具有多个帮助程序类的单个数据库。

0
投票
我遇到了与尝试通过ContentResolver访问数据库相同的问题,而我已经对其建立了直接的SQLiteDatabase直接连接(交易需要)。

我通过更改代码的顺序来解决它,以便在打开直接的ContentResolver连接之前完成SQLiteDatabase的工作。

我还删除了一些代码,所以我不再关闭直接的SQLiteDatabase

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


0
投票
就我而言,此错误是由于常见错误引起的。最初,我的SQLite数据库由从MySQL的JsonArray接收的数据填充。在SQLite数据库中添加其他列后,发生了类似的错误。简而言之,我忘了在MySQL数据库中添加相应的列。。:)
© www.soinside.com 2019 - 2024. All rights reserved.