【问题标题】:Database Queue for android SQLiteandroid SQLite 的数据库队列
【发布时间】:2013-11-03 16:26:22
【问题描述】:

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

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

我可以放

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

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

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

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

任何建议将不胜感激

【问题讨论】:

    标签: android database multithreading sqlite


    【解决方案1】:

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

    将所有数据库写入移动到IntentService、托管LinkedBlockingQueue 的常规服务、由单身人士SQLiteOpenHelper 持有的LinkedBlockingQueue 等。

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

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

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

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

    【讨论】:

    • IntentService 在 Android O 上不再可行 :(
    • @MooingDuck: IntentService 仍然可行;它只需要在前台。我们现在还有其他选择:除了我在答案中提到的那些之外,基于 RxJava 的队列、WorkManager 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多