1

谁能解释我为什么会发生以下情况。这是使用 SQLite db 的 Android 应用程序。

  1. 应用程序将新数据添加到数据库中,这些数据存储在外部存储器中。
  2. 同时这个外存不可用(比如我挂载到PC上)。
  3. 当外部存储器再次可用时,我无法以只读模式访问 db。但是,如果我尝试以读写模式打开它,它会顺利进行。为什么?

我编写了代码(如下),它处理了这个问题并且效果很好,但我仍然不明白为什么

这与剩余的打开连接或类似的东西无关。为了确保,我从设备上完全删除了我的应用程序并重新安装它。但即使在那之后,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());
4

1 回答 1

1

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

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

于 2012-11-28T07:45:59.950 回答