【问题标题】:Difference between getWritableDatabase() and getReadableDatabase()?getWritableDatabase() 和 getReadableDatabase() 的区别?
【发布时间】:2012-06-01 04:52:38
【问题描述】:

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

【问题讨论】:

标签: android database


【解决方案1】:

取自我已删除的答案here(这个问题与那个问题重复)。

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

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

【讨论】:

    【解决方案2】:

    查看Reference

    公共同步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()。) bad 等错误 权限或磁盘已满可能会导致此方法失败,但将来 如果问题得到解决,尝试可能会成功。

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

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

    投掷 SQLiteException 如果无法打开数据库进行写入

    【讨论】:

    • @tai.tran2008 看第一段:This(getReadableDatabase ()) 将与 getWritableDatabase() 返回的对象相同,除非某些问题(例如磁盘已满)需要数据库以只读方式打开。因此,如果您只想读取名称,请使用 getReadableDatabase(),这样可以简化您想要的内容。
    【解决方案3】:

    两者之间的不同是磁盘已满的情况。 getReadableDatabase()getWritableDatabase() 任务都是打开/创建数据库。

    但是,如果您调用getWritableDatabase(),当磁盘已满时应用程序会崩溃。但是,getReadbleDatabase() 在这种情况下可以正常工作。因为,getReadableDatabase() 阻止写入操作并允许读取操作。

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

    【讨论】:

      【解决方案4】:

      主要区别是——

      getReadbleDatabase() -

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

      getWritableDatabase() -

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2011-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-09
          • 1970-01-01
          • 2012-10-28
          • 1970-01-01
          相关资源
          最近更新 更多