首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android中处理sqlite‘数据库是锁定的’错误

问在Android中处理sqlite‘数据库是锁定的’错误
EN

Stack Overflow用户
提问于 2011-05-12 05:47:24
回答 2查看 2.7K关注 0票数 2

我有一个应用程序,它有大量的数据库活动。我不时地得到SQLite‘数据库被锁定’的错误,导致SQLiteExceptions。当我试着用:

代码语言:javascript
复制
if((!db.isDbLockedByCurrentThread())&&(!db.isDbLockedByOtherThreads())) {

在使用“保存”或“插入”之前,但这尚未成功。所以,我在一堂课上设置了以下内容。MyApplication,它像这样扩展应用程序:

代码语言:javascript
复制
private AtomicBoolean writingToDataBaseFlag = new AtomicBoolean(false);

带着一个访问者:

代码语言:javascript
复制
public AtomicBoolean getWritingToDataBaseFlag() {
    return writingToDataBaseFlag;
}

每当我想要执行插入或保存时,我都会执行如下操作:

代码语言:javascript
复制
boolean succeeded = false;
while(!succeeded) {
   if(application.getWritingToDataBaseFlag().compareAndSet(false, true)) {
       if((!db.isDbLockedByCurrentThread())&&(!db.isDbLockedByOtherThreads())) {
           if(!activity.isFinishing()) {
               set_id(db.insert(SDIGENRE, SDIID, cv));
           }
       }
       application.getWritingToDataBaseFlag().compareAndSet(true, false);
       succeeded = true;
    } else {
    // Wait 100 millis
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

这似乎已经有相当一段时间了。

  1. 是解决这个问题的正确方法吗?
  2. ,我又开始看到这些错误了;对于如何调试这个问题,有什么建议吗?

谢谢你的帮助朱利叶斯。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-15 22:40:17

最后,我的DbHelper (SQLiteOpenHelper)只有一个实例绑定到我的应用程序中。通过进行所有的调用,我从来没有任何并发问题。

票数 1
EN

Stack Overflow用户

发布于 2014-11-20 11:24:57

好吧,我可以获得信息。并找到一篇关于线程操作数据库的有趣文章。

在android中,said : isDbLockedByOtherThreads()在API 16之后被弃用,总是返回false。不要使用这种方法。

因此,问题来自于isDbLockedByCurrentThread();

android提到了这个方法:

如果当前线程持有到数据库的活动连接,则返回true。

此方法的名称来自与数据库的活动连接意味着线程在数据库上持有实际锁的时间。现在,不再存在真正的“数据库锁”,尽管如果线程无法获得执行特定操作的数据库连接,则可能会阻塞。

实际上,当您插入、删除、修改android框架中的sqlitedatabase时,它都是关于单个线程的。这意味着当您使用两个或多个线程操作(插入、删除、修改) sqlitedatabase时,它将抛出‘数据库被锁定’的错误;

但是您可以打开多线程来排队同一个sqlitedatabase,它不会有任何问题。

顺便说一句,如果您在处理插入时想要队列,则应该使用

代码语言:javascript
复制
getWritableDatabase().enableWriteAheadLogging();

它只在Android3.0或更高版本上工作;

也许你应该读这篇文章(如果你能读中文,哈哈):http://tech.techweb.com.cn/thread-621414-1-1.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5973799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档