7

我使用读写数据库没有任何问题。但我无法找出区别。我在互联网上搜索过,但不是很清楚。谁能告诉我区别?在哪种情况下我应该使用getWritableDatabase()or getReadableDatabase()

4

5 回答 5

22

取自我在此处删除的答案(此问题与该问题重复)。

在正常情况下,getReadableDatabase()将返回由getWritableDatabase().

但是,如果无法返回可写数据库, getWritableDatabase()则会失败,而getReadableDatabase() 会尝试返回READ_ONLY数据库。

于 2012-08-01T02:11:52.963 回答
10

检查参考

公共同步 SQLiteDatabase getReadableDatabase ()

自:API 级别 1

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

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

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

如果无法打开数据库,则抛出 SQLiteException

公共同步 SQLiteDatabase getWritableDatabase ()

自:API 级别 1

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

一旦打开成功,数据库就会被缓存,所以每次需要写入数据库时​​都可以调用这个方法。(确保在不再需要数据库时调用 close()。)权限错误或磁盘已满等错误可能会导致此方法失败,但如果问题得到解决,以后的尝试可能会成功。

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

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

如果无法打开数据库进行写入,则抛出 SQLiteException

于 2012-06-01T05:04:44.160 回答
3

两者的区别在于磁盘已满时的情况。getReadableDatabase()和任务都是getWritableDatabase()打开/创建数据库。

但是,如果您调用getWritableDatabase(). 但是,getReadbleDatabase()在这种情况下工作正常。因为,getReadableDatabase()块写入操作并允许读取操作。

不要从应用程序主线程调用这些方法,如 Android 中的onCreate()方法MainActivity或任何回调方法。

于 2015-08-13T07:22:37.090 回答
0

主要区别在于——

getReadbleDatabase() -

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

getWritableDatabase() -

  • 创建和/或打开将用于读取和写入的数据库。第一次调用时,将打开数据库并调用 onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase, int, int) 和/或 onOpen(SQLiteDatabase)。一旦打开成功,数据库就会被缓存,所以每次需要写入数据库时​​都可以调用这个方法。(确保在不再需要数据库时调用 close()。)权限错误或磁盘已满等错误可能会导致此方法失败,但如果问题得到解决,以后的尝试可能会成功。
于 2020-01-22T03:56:44.260 回答
0

如果您的数据库崩溃GetReadableDatabase()将返回一个只读/只读对象,而GetWriteableDatabase()将失败。

于 2021-01-09T03:18:04.223 回答