数据库连接丢失后访问SQLite数据库

时间:2012-11-27 20:28:29

标签: android sqlite

任何人都可以解释为什么会发生以下情况。这是使用SQLite数据库的Android应用程序。

  1. 应用程序向db添加新数据,存储在外部存储器中。
  2. 同时,此外部存储器不可用(例如,我将其安装到PC)。
  3. 当外部存储器再次变为可用时,我无法以 read_only 模式访问数据库。但是,如果我尝试在读写模式下打开它,它会顺利进行。为什么?
  4. 我编写了代码(下面),它处理了这个问题并且运行良好,但我仍然不理解为什么

    NOT 与剩余的开放式连接或此类内容相关。为了确保,我完全从设备中删除了我的应用程序并重新安装它。但即便如此,db在只读模式下也无法使用。 db在读写模式下打开一次后,下次可能会在只读中打开,没有任何问题。

    当我说“不可用”时,我的意思是db打开很好,但是对db的任何查询都因IO错误而失败。

            SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), null, SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    
            if (!testQuery(db))
            {
                Utils.logD("Failed to open db at path: " + f + ". Trying recovering...");
                db.close();
                db = SQLiteDatabase.openDatabase(f.getPath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
                if (!testQuery(db))
                {
                    Utils.logD("Failed to open db at path: " + f + " (noway)");
                    db.close();
                    return null;
                }
            }
    
    
    
            Utils.logD("DATABASE OPENED! " + db.hashCode());
    

1 个答案:

答案 0 :(得分:1)

如果在事务仍处于活动状态时数据库不可用,则必须在DB再次处于一致状态之前回滚此事务。此回滚需要写访问权限。

这意味着只有在永远不会更改数据库时才应该以只读模式打开数据库。