getWritableDatabase()和getReadableDatabase()之间的区别?

时间:2012-06-01 04:52:39

标签: android database

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

5 个答案:

答案 0 :(得分:21)

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

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

答案 1 :(得分:9)

检查Reference

公共同步SQLiteDatabase getReadableDatabase()

自:API Level 1

  

创建和/或打开数据库。这将是返回的同一对象   by getWritableDatabase()除非出现一些问题,比如一个完整的磁盘,   要求数据库以只读方式打开。在那种情况下,a   将返回只读数据库对象。如果问题得到解决,a   将来调用getWritableDatabase()可能会成功,在这种情况下   将关闭只读数据库对象和读/写对象   将来会被退回。

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

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

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

公共同步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 :(得分:2)

两者之间的差异是磁盘变满时的情况。 getReadableDatabase()getWritableDatabase()任务都是打开/创建数据库。

但是如果你打电话给getWritableDatabase(),当磁盘完全崩溃时会崩溃。但是,getReadbleDatabase()在这种情况下可以正常工作。因为,getReadableDatabase()阻止写操作并允许读操作。

请勿在应用程序主线程中调用这些方法,例如Android中onCreate()的{​​{1}}方法或任何回调方法。

答案 3 :(得分:0)

主要区别是-

getReadbleDatabase()-

  • 创建和/或打开数据库。这将是返回的相同对象 通过getWritableDatabase()进行操作,除非出现某些问题,例如磁盘已满, 要求数据库以只读方式打开。在这种情况下, 将返回只读数据库对象。如果问题已解决, 将来对getWritableDatabase()的调用可能会成功,在这种情况下, 只读数据库对象将关闭,而读/写对象 将来会退回。

getWritableDatabase()-

  • 创建和/或打开一个数据库,该数据库将用于读取和 写作。第一次调用时,将打开数据库 和onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int) 和/或onOpen(SQLiteDatabase)将被调用。一旦打开 成功地缓存了数据库,因此可以调用此方法 每次您需要写入数据库时​​。 (请务必致电 当您不再需要数据库时使用close()。 权限或磁盘已满可能导致此方法失败,但是将来 如果问题解决,尝试可能会成功。

答案 4 :(得分:0)

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