Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android数据库已锁定_Android - Fatal编程技术网

Android数据库已锁定

Android数据库已锁定,android,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/AndroidR

我得到以下错误。那么如何解锁我的数据库呢

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)

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


有关详细信息,请签出此项。

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

因此,我建议:

  • 您只能从一个
    SQLOpenHelper
  • 确保在完成数据库帮助程序的所有实例后关闭它们
  • 在使用事务时,如果未将事务设置为成功(即,如果要回滚),请确保始终使用
    endTransaction()
    结束事务
  • 你可以试着用,我没有用过,但我听到这里的其他人对它赞不绝口

在整个应用程序中使用单一连接。请看这里:


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

我也有同样的问题,试着用这个

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

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

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

我通过更改代码的顺序解决了这个问题,这样在打开direct
SQLiteDatabase
连接之前就完成了
ContentResolver
的工作

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


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

在我的例子中,这个错误是由于常见的错误造成的。最初,我的SQLite数据库由从MySQL接收的JsonArray数据填充。在SQLite数据库中添加额外的列之后,发生了类似的错误。简单地说,我忘了在MySQL数据库中添加相应的列:)

当我们被抛出如下错误时,我们能做什么

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

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

因此,我的解决方案是:

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

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

1.确保在同一文件上仅使用单个SQLiteOpenHelper。2.确保一次只有一个线程在使用您的SQLiteDatabase。blogpost的链接已断开,新链接已断开,而“新链接”也未断开,但现在blogpost似乎可以工作,尽管“新链接”仍断开。我正在多进程应用程序中使用数据库。只有少数用户面临这个问题。你能告诉我解决这个问题的办法吗。数据库被锁定(代码5):,编译时:PRAGMA journal_modeI将OrmLite的原始端口写入Android。你的第一个建议,只使用一个助手,是一个很好的建议。你的第二个和第一个相矛盾。“关闭数据库帮助程序的所有实例”意味着超过1。只使用一个,永远!!!此外,您不需要关闭助手连接。请看我的答案。最初,我为OrmLite编写了复杂的引用计数代码,以帮助保持一个助手的活动状态,并在完成后将其关闭,但事实证明,Sqlite“连接”只是文件句柄。系统将在转储进程时为您关闭它们。嘿,凯文,这是否意味着您永远不必关闭数据库处理程序?是的。我知道这听起来很糟糕。处理程序只是一个文件句柄。当进程结束时,它将关闭。SQLite不会自行损坏。至于只在logcat中显示错误,对于“insert”是这样的,而对于其他方法则不是这样。这就是为什么您应该始终称之为“insertOrThrow”。是否有关于这方面的好教程,我从未遇到过关于Android中SQLite的全面教程:-(谢谢:Diges,请看我的回答:它链接到各种最佳实践的示例。你能修复此链接吗?你如何使用单个连接处理多线程访问?我使用了此方法,但在我的情况下不起作用。请看我的问题,你使用的外部API正在做一些奇怪的事情。我想你需要调整方式。)您正在调用他们的API。城市航空公司不太可能经常发生这种崩溃。