【问题标题】:getWritableDatabase() VS getReadableDatabase()getWritableDatabase() VS getReadableDatabase()
【发布时间】:2011-09-29 15:35:21
【问题描述】:

我正在创建一个数据库助手类,对于其中的一些方法,我只查询数据库,而我正在向它写入其他方法。

我的理解是这两种方法都会打开数据库,让程序要么读取要么写入数据库。

对于查询语句,是否值得仅使用 getReadableDatabase() 或者两种方法之间的性能差异很小。

感谢您的宝贵时间。

【问题讨论】:

标签: android performance sqlite


【解决方案1】:

它们返回相同的对象,除非磁盘已满或存在强制以只读模式打开数据库的权限错误。这个名字有点混乱:)

根据经验,您应该在 UI 线程之外调用这些方法。两者都可能需要很长时间才能返回。

如果您不打算编写数据库,请使用getReadableDatabase,因为它有助于您的代码清晰和意图。

更多信息here

【讨论】:

  • 即使我使用getWritableDataBase,我也可以执行选择语句吗?
【解决方案2】:

如果您查看 Google 的 NotePad 示例项目中的 NotepadProvider.java,您会发现它们同时使用这两种方法 - 取决于用例。

【讨论】:

    【解决方案3】:

    如果您对数据库执行太多操作,例如查询,以某种随机顺序频繁更新,那么使用 getReadabledatabase 并没有任何意义,因为它只能用于读取值。

    根据您的应用需求,您可以判断使用情况。如果您只是不断地读取这些值,那么您可以使用 getreadabledatabase。

    注意:有时当您尝试使用 getwritabledatabase 打开可写数据库时,如果系统发现写入权限等异常,在这种情况下,系统可能会抛出异常。在这种情况下,您可以使用 getreadabledatabase 打开数据库。

    【讨论】:

      【解决方案4】:

      如果在实现并发(多线程)数据库调用时遇到“数据库已锁定”类型错误,请使用 getWritableDatabase 而不是 getReadableDatabase。

      【讨论】:

        【解决方案5】:

        以只读方式打开数据库应该会稍微提高性能,因为锁定开销会更低。

        【讨论】:

        • 这不是真的。对 getReadableDatabase 的调用大部分时间都会返回一个可写的数据库对象,除非磁盘已满或存在权限错误。
        • 所以基本上两种方法在性能和使用上没有区别。谢谢
        • @JamesDudley 除了 getReadableDatabase 必须返回可写数据库。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多