1

我有一个 Android 应用程序,它拥有一个相当大的数据库,可以从多个线程访问。我开始得到数据库锁定异常。我的问题是,有没有一种方法可以创建数据库队列(类似于 iOS 中的 FMDataBase.Queue)?

我做了一些研究,我不想创建一个帮助类,因为我的很多数据库查询和插入都是不同的,所以为每个查询创建一个方法是不可行的。

我可以把

if(!db.isLocked)
{
    //exec(BLAH)
}
 else
{
  //try{thread.sleep(1000);}... then some retry code
}

在每个数据库功能上,但必须有比这更好的方法。

此外,如果线程在睡眠 1000 毫秒后被锁定,它仍然会崩溃,如果数据库被锁定 10 毫秒,我将等待 990 毫秒以等待查询运行,这对用户体验不利。

是否可以创建一个队列,以便在数据库解锁后执行任何发送到数据库的命令?

任何建议将不胜感激

4

1 回答 1

1

我的问题,有没有办法创建一个数据库队列

将所有数据库写入移动到a 、IntentService托管 a 的常规服务LinkedBlockingQueueLinkedBlockingQueue由单例持有的aSQLiteOpenHelper等。

我的很多数据库查询和插入都是不同的,因此为每个查询创建一个方法是不可行的。

用一种方法包装数据库 I/O 的开销不是特别多,比您在问题中建议的要少。

如果数据库被锁定 10 毫秒,我将等待 990 毫秒才能运行查询,这对用户体验不利

调整您的数据库访问(例如,EXPLAIN关键字,然后设置适当的索引)。使用 Traceview 准确确定您的问题所在。如果您的问题出在数据库事务中(例如,您打开自己的事务并在其中做大量工作),请考虑使用yieldIfContendedSafely().

于 2013-11-03T16:50:50.637 回答