【问题标题】:Android simultaneous db operations -- "database is locked"Android 同时数据库操作——“数据库被锁定”
【发布时间】:2010-11-29 09:18:05
【问题描述】:

我正在编写一个具有“在线模式”的应用程序,即根据需要将数据下载、解析并插入到 SQLite 数据库中。所有这些都是由服务执行的。该应用由多个请求服务进行数据更新的活动组成(不同的数据取决于活动)。

当用户浏览活动时(无需等待服务完成),很容易得到 SQLiteExceptions(消息:数据库已锁定)。

我曾考虑过使用 synchronized 块,但这会迫使用户在加载新活动(需要访问数据库才能加载)时等待服务完成更新。所以这似乎是一个死胡同。

另一个选项可能是在每个活动的 onStop 方法中停止更新。当然,更新会被中断,但这不是什么大问题。问题是我不确定如何处理它。

我的问题是,我该如何/应该如何处理?

【问题讨论】:

    标签: android database simultaneous


    【解决方案1】:

    如果您的活动只是像我的情况那样读取而不是写入数据库,这就是我作为解决方法所做的:

    • 创建一个服务(即 DatabaseService 0 并将其用作访问数据库的中心点(即打开一个数据库连接)以确保您一次只有一个 dbhelper。
    • 所有需要访问数据库的活动和服务都必须建立到DatabaseService的连接
    • 确保只有您的 DownloadService 的线程能够写入数据库并且它应该使用事务
    • 之后,您可以使用getReadable数据库读取/使用连接停止下载服务等。

    只要确保您只使用 1 个 dbhelper。

    【讨论】:

    • 感觉很愚蠢(尤其是关于“只有一个 dbhelper”的部分。我用单例试了一下,因为它的测试速度更快,而且有效。干杯!
    • 如果你和我一样有多个 Content Providers,把一个 DBhelper 变成 Singleton。
    • 当需要将上下文传递给 SQLiteOpenHelper 的构造函数时,如何获得单例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2011-10-30
    相关资源
    最近更新 更多