我正在通过混合的Android Cordova应用程序中的SQLCipher实现对SQLite数据库的访问,该应用程序使用一个自定义插件(即由我编写)。 SQLCipher文档以及有关在Android中使用SQLite的其他教程-始终引用Context.getDatabasePath。在我的插件代码中,我存储了其他应用程序文件并大量使用Context.getFilesDirgetDatabasePathgetFilesDir有何不同。例如,是否因为操作系统决定通过删除存储在Context.getFilesDir中的某些文件来创建“更多空间”而保证数据库将持久存在并且不会以某种方式转储的机会更大?

最佳答案

两者都解析到同一目录。 getDatabasePath调用getDatabasesDir

getDatabasesDir

  private File getDatabasesDir() {
        synchronized (mSync) {
            if (mDatabasesDir == null) {
                if ("android".equals(getPackageName())) {
                    mDatabasesDir = new File("/data/system");
                } else {
                    mDatabasesDir = new File(getDataDir(), "databases");
                }
            }
            return ensurePrivateDirExists(mDatabasesDir);
        }
    }


getFilesDir

  @Override
    public File getFilesDir() {
        synchronized (mSync) {
            if (mFilesDir == null) {
                mFilesDir = new File(getDataDir(), "files");
            }
            return ensurePrivateDirExists(mFilesDir);
        }
    }


注意,返回的File在两种方法中均由ensurePrivateDirExists解析,该输入具有由getDataDir解析的相同输入目录。

getDataDir


  返回文件系统上所有目录的绝对路径
  属于此应用的私人文件被存储。


因此,您的情况没有区别。

不要忘记返回的路径可以更改,如doc所示:


  如果将调用的应用程序移至,返回的路径可能会随时间变化
  已采用的存储设备,因此仅应保留相对路径。

09-26 15:30