【发布时间】:2012-06-01 04:52:38
【问题描述】:
我使用读写数据库没有任何问题。但我无法找出区别。我在互联网上搜索过,但不是很清楚。谁能告诉我区别?在哪种情况下我应该使用getWritableDatabase() 或getReadableDatabase()?
【问题讨论】:
-
我读了,但我找不到不同之处和结论?
-
@oers : 谢谢你帮我解决了我糟糕的英语问题。
我使用读写数据库没有任何问题。但我无法找出区别。我在互联网上搜索过,但不是很清楚。谁能告诉我区别?在哪种情况下我应该使用getWritableDatabase() 或getReadableDatabase()?
【问题讨论】:
取自我已删除的答案here(这个问题与那个问题重复)。
在正常情况下,
getReadableDatabase()将返回相同的getWritableDatabase()返回的可写数据库。但是,如果无法返回可写数据库,
getWritableDatabase()将失败,而getReadableDatabase()将尝试返回READ_ONLY数据库。
【讨论】:
自:API 级别 1
创建和/或打开数据库。这将是返回的相同对象 通过 getWritableDatabase() 除非出现问题,例如磁盘已满, 要求以只读方式打开数据库。在这种情况下,一个 将返回只读数据库对象。如果问题得到解决,则 未来对 getWritableDatabase() 的调用可能会成功,在这种情况下 只读数据库对象将被关闭并且读/写对象 将来会被退回。
和getWritableDatabase()一样,这个方法可能需要很长时间才能返回,所以你不应该从应用程序主线程调用它,包括从ContentProvider.onCreate()。 返回
a database object valid until getWritableDatabase() or close() is called.
投掷 SQLiteException 如果数据库无法打开
自:API 级别 1
创建和/或打开一个用于读取和/或打开数据库 写作。第一次调用时,将打开数据库 和 onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) 和/或 onOpen(SQLiteDatabase) 将被调用。
一旦打开成功,数据库就会被缓存,所以你可以调用这个 每次需要写入数据库的方法。 (确保 当你不再需要数据库时调用 close()。) bad 等错误 权限或磁盘已满可能会导致此方法失败,但将来 如果问题得到解决,尝试可能会成功。
数据库升级可能需要很长时间,您不应该从应用程序主线程调用此方法,包括从 ContentProvider.onCreate()。 返回
a read/write database object valid until close() is called
投掷 SQLiteException 如果无法打开数据库进行写入
【讨论】:
两者之间的不同是磁盘已满的情况。 getReadableDatabase() 和 getWritableDatabase() 任务都是打开/创建数据库。
但是,如果您调用getWritableDatabase(),当磁盘已满时应用程序会崩溃。但是,getReadbleDatabase() 在这种情况下可以正常工作。因为,getReadableDatabase() 阻止写入操作并允许读取操作。
不要从应用程序主线程调用这些方法,例如从 Android 中的 MainActivity 的 onCreate() 方法或任何回调方法。
【讨论】:
主要区别是——
getReadbleDatabase() -
getWritableDatabase() -
【讨论】:
如果您的数据库崩溃 GetReadableDatabase() 将返回一个只读对象
而GetWriteableDatabase() 将失败。
【讨论】: