我收到了以下错误。那么如何解锁我的数据库?
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)
答案 0 :(得分:38)
我认为您忘记关闭数据库,或者当您尝试写入数据库时,另一个线程正在写入数据库。 SQLite
在写入数据库时将其锁定,以避免在另一个实体同时尝试写入同一数据库时发生损坏。 Android,只会在log cat中显示错误,而您提供的查询将被遗忘...
所以,我建议:
SQLOpenHelper
endTransaction()
结束交易,以防您使用交易答案 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())