getWritableDatabase()与getReadableDatabase()的区别

20
我正在创建一个数据库助手类,其中一些方法仅查询数据库,而另一些则写入它。 我的理解是这两种方法都会打开数据库,并让程序只读或向数据库写入数据。 对于查询语句,是否值得仅使用getReadableDatabase(),或者两种方法之间的性能差异非常小?谢谢你的时间。

https://dev59.com/m2TWa4cB1Zd3GeqPDnvo - user2864740
https://youtu.be/jBjSb70yOMk - Piyush Kukadiya
5个回答

18

除非磁盘已满或存在某些权限错误强制以只读模式打开数据库,否则它们将返回相同的对象。不过名称有点令人困惑 :)

一般来说,您应该将对这些方法的任何调用放在UI线程之外。两者都可能需要很长时间才能返回。

如果您不打算写入数据库,则只需使用getReadableDatabase,因为它将有助于提高您代码的清晰度和意图。

更多信息请点击此处


那么,即使我使用 getWritableDataBase,我是否可以执行 select 语句? - Sourav Kanta

2

如果你查看Google的NotePad示例项目中的NotepadProvider.java,你会发现他们根据使用情况同时使用两种方法。


1
如果您在数据库上执行太多操作,例如以某种随机顺序频繁查询、更新,则使用getReadabledatabase就没有任何意义,因为它只能用于读取值。
根据您的应用程序要求,您可以判断使用情况。如果您只是不断地读取值,则可以使用getreadabledatabase。
注意:有时当您尝试打开可写的数据库时,使用getwritabledatabase,如果系统发现像写入权限之类的异常,那么系统可能会抛出异常。在这种情况下,您可以使用getreadabledatabase打开数据库。

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

-2

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


4
这并不完全正确。调用getReadableDatabase的大部分情况下会返回一个可写的数据库对象,除非磁盘已满或存在权限错误。 - mgv
2
基本上,在性能和使用方面,这两种方法没有区别。谢谢。 - James Dudley
1
@JamesDudley 除了getReadableDatabase不必返回可写数据库。 - user2864740

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接