如何更改 Room DataBase 的默认数据库文件位置?

Gaj*_*lur 5 android android-sqlite android-room

我在我的应用程序中使用 RoomDB。能够执行 crud 操作。其实我想看看db文件。

getDatabasePath("user.db").getAbsolutePath();
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我db文件所在的目录,保存目录是这样的

 /data/data/com.example.manvish.roomdb/databases/user.db
Run Code Online (Sandbox Code Playgroud)

但即使在命令提示符下使用 sudo ,我仍然无法访问数据目录。现在我想将 DB 文件位置更改为内部存储器或 SD 卡中的其他一些文件夹。我怎样才能做到这一点?

Ben*_*son -1

不确定这是否是您正在寻找的,但就我而言,就像 @M.Yogeshwaran 一样,我需要能够设置数据库的初始状态并从那里开始工作,所以我最终这样做了:

/**
 * @param context
 */
public DatabaseService(Context context) {

        File dst = context.getDatabasePath(DB_NAME);
        dst.delete();
        File src = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath()+"/database.db");
        try {
            copy(src,dst);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Init the database singleton
        db = Room.databaseBuilder(context, CrediforceDatabase.class, Constants.DB_NAME).build();
}

public static void copy(File src, File dst) throws IOException {
    try (InputStream in = new FileInputStream(src)) {
        try (OutputStream out = new FileOutputStream(dst)) {
            // Transfer bytes from in to out
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为了更清楚一点:

  1. DB_NAME =“数据库.db”
  2. 出于测试目的,我在下载文件夹中有要“导入”的“database.db”,稍后我将转换此代码,以便设备从服务器中提取初始数据库。
  3. dst.delete(); 只是删除现有的数据库文件,因为我正在测试(不确定是否需要)
  4. 这基本上翻译为:启动应用程序 > 替换数据库文件 > 构建数据库。
  5. 必须小心 room_master_table 中的identity_hash,如果这与预期的不同,它将不起作用。

另外,我从这个答案中得出了这个想法: /sf/answers/3526871561/

希望它对任何人都有帮助!

PS,如果您需要的只是能够查看数据并执行 CRUD 操作,您可以随时使用此插件: https: //github.com/amitshekhariitbhu/Android-Debug-Database