我使用读写数据库没有任何问题。但我无法找出差异。我在互联网上搜索但不太清楚。有人能告诉我区别吗?在哪种情况下,我应该使用getWritableDatabase()
还是getReadableDatabase()
?
答案 0 :(得分:21)
在正常情况下,getReadableDatabase()
将返回getWritableDatabase()
返回的相同可写数据库。
但是,如果无法返回可写数据库,getWritableDatabase()
将失败,而getReadableDatabase()
将尝试返回READ_ONLY
数据库。
答案 1 :(得分:9)
自:API Level 1
创建和/或打开数据库。这将是返回的同一对象 by getWritableDatabase()除非出现一些问题,比如一个完整的磁盘, 要求数据库以只读方式打开。在那种情况下,a 将返回只读数据库对象。如果问题得到解决,a 将来调用getWritableDatabase()可能会成功,在这种情况下 将关闭只读数据库对象和读/写对象 将来会被退回。
与getWritableDatabase()一样,此方法可能需要很长时间才能返回,因此您不应该从应用程序主线程(包括ContentProvider.onCreate())调用它。 返回
a database object valid until getWritableDatabase() or close() is called.
抛出 SQLiteException如果无法打开数据库
自: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 :(得分:2)
两者之间的差异是磁盘变满时的情况。 getReadableDatabase()
和getWritableDatabase()
任务都是打开/创建数据库。
但是如果你打电话给getWritableDatabase()
,当磁盘完全崩溃时会崩溃。但是,getReadbleDatabase()
在这种情况下可以正常工作。因为,getReadableDatabase()
阻止写操作并允许读操作。
请勿在应用程序主线程中调用这些方法,例如Android中onCreate()
的{{1}}方法或任何回调方法。
答案 3 :(得分:0)
主要区别是-
getReadbleDatabase()-
getWritableDatabase()-
答案 4 :(得分:0)
如果您的数据库崩溃 GetReadableDatabase()
将返回一个只读对象
而 GetWriteableDatabase()
会失败。