getWritableDatabase()和getReadableDatabase()的区别是什么?

7

我能够读写数据库,但我不知道getWritableDatabase()getReadableDatabase()有何区别。我在网上搜索了很多资料,但并没有得到清晰的解释。请问这两个方法应该如何选择使用?


可能是[getWritableDatabase() VS getReadableDatabase()]的重复问题 (https://dev59.com/vmw15IYBdhLWcg3wd7hj) - Krishnabhadra
https://dev59.com/IU7Sa4cB1Zd3GeqP4INl - Krishnabhadra
我读了它,但是我找不到区别和结论? - Tai Tran
https://dev59.com/vmw15IYBdhLWcg3wd7hj - Manroop
@oers:感谢你帮我改正了我的糟糕英语。 - Tai Tran
可能是[getWritableDatabase() VS getReadableDatabase()]的重复问题(https://dev59.com/vmw15IYBdhLWcg3wd7hj)。 - Mark
5个回答

22

从我删除的答案(这个问题是那个问题的副本)中得出。

正常情况下,getReadableDatabase()将返回与getWritableDatabase()相同的可写数据库。

然而,如果无法返回可写数据库,getWritableDatabase()将失败,而getReadableDatabase()将尝试返回一个READ_ONLY数据库。


10

请查看参考文献

public synchronized SQLiteDatabase getReadableDatabase ()

自:API Level 1

创建并/或打开一个数据库。这将与getWritableDatabase()返回的对象相同,除非出现一些问题,例如满盘,需要只读方式打开数据库。在这种情况下,将返回一个只读数据库对象。如果问题已解决,则将来对getWritableDatabase()的调用可能会成功,在这种情况下,只读数据库对象将被关闭,并将在将来返回读写对象。

与getWritableDatabase()一样,此方法可能需要很长时间才能返回,因此您不应从应用程序主线程中调用它,包括从ContentProvider.onCreate()中调用。 返回值

a database object valid until getWritableDatabase() or close() is called. 

如果无法打开数据库,则会抛出SQLiteException异常。

public synchronized SQLiteDatabase getWritableDatabase ()

自API Level 1起

创建和/或打开一个用于读写的数据库。第一次调用此方法时,将打开数据库,并且将调用onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase, int, int)和/或onOpen(SQLiteDatabase)。

打开成功后,数据库将被缓存,因此您可以每次需要写入数据库时调用此方法。(确保在不再需要数据库时调用close()。)诸如错误权限不足或磁盘已满等错误可能导致此方法失败,但是如果问题得到修复,将来的尝试可能会成功。

数据库升级可能需要很长时间,您不应该从应用程序主线程中调用此方法,包括从ContentProvider.onCreate()中调用。返回值:

a read/write database object valid until close() is called 

如果数据库无法进行写操作,会抛出 SQLiteException 异常。


2
@tai.tran2008 看第一段:这个(getReadableDatabase())将会是由getWritableDatabase()返回的相同对象,除非出现一些问题,例如磁盘已满,需要以只读方式打开数据库。因此,如果您只想读取,请使用**getReadableDatabase()**,因为名称使其更容易理解您想要什么。 - Imran Rana

3
两者之间的区别在于磁盘满时的情况。 getReadableDatabase()getWritableDatabase() 的任务都是打开/创建数据库。
但是,如果调用 getWritableDatabase() 并且磁盘已满,则应用程序会崩溃。然而,在这种情况下,getReadbleDatabase() 可以正常工作。因为 getReadableDatabase() 阻止写操作并允许读操作。
不要从应用程序的主线程(例如来自 Android 中的 MainActivityonCreate() 方法或任何回调方法)调用这些方法。

0

主要区别是 -

getReadableDatabase() -

  • 创建和/或打开一个数据库。这将是由getWritableDatabase()返回的相同对象,除非出现一些问题,例如磁盘已满,需要只读方式打开数据库。在这种情况下,将返回一个只读数据库对象。如果问题得到解决,则将来对getWritableDatabase()的调用可能会成功,在这种情况下,只读数据库对象将被关闭,并且将来将返回读/写对象。

getWritableDatabase() -

  • 创建和/或打开一个将用于读取和写入的数据库。第一次调用此方法时,将打开数据库并调用onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase, int, int)和/或onOpen(SQLiteDatabase)。一旦成功打开数据库,它就会被缓存,因此每次需要写入数据库时都可以调用此方法。(确保在不再需要数据库时调用close()。)诸如错误权限或磁盘已满之类的错误可能会导致此方法失败,但如果问题得到解决,则将来的尝试可能会成功。

0
如果你的数据库崩溃了,GetReadableDatabase()会返回一个只读对象,而GetWriteableDatabase()则会失败。

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