如何将行从另一个数据库文件插入到房间数据库中?

How to insert rows into a Room Database from another database file?

我的应用程序有一个预填充的 Room 数据库,当应用程序首次启动时,它会从“资产”文件夹复制到设备中应用程序的数据文件夹。

现在我正在研究如何在数据库文件已经存在的情况下向数据库中添加行。为此,我将使用 Firebase 存储来保存“主文件”,我需要下载主文件,然后我需要检查应用程序“数据”文件夹中的当前文件中是否存在所有行,如果有的话缺少行,然后我会将缺少的行插入到复制到设备的数据库文件中。

我的问题是我不知道在哪里下载“主文件”以及如何访问该文件的内容。我应该创建另一个 DAO 和 Room 数据库 class 来访问该文件,以便我可以循环遍历内容并像那样添加缺失的行,还是有其他方法。

目前我用这个方法复制的文件

    private void loadDbFromFirebase(){
        StorageReference pathReference = storageRef.child("user database/" + userId + "/locations_table");
        String currentDBPath = "/data/data/"+ getPackageName() + "/databases/locations_table";
        // create file from the database path and convert it to a URI
        File currentDbFile = new File(currentDBPath);
        pathReference.getFile(currentDbFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                Toast.makeText(MainActivity.this, "download was successful" , Toast.LENGTH_SHORT).show();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(MainActivity.this, "download was not successful", Toast.LENGTH_SHORT).show();
            }
        });
    }

您可以使用 cursorrawQuery 从文件访问数据库的内容:

val database = SQLiteDatabase.openDatabase(
                        context.applicationInfo.dataDir.toString() + "/databases/<database_name>",
                        null,
                        SQLiteDatabase.OPEN_READONLY)

val cursor = database.rawQuery("select * from tableName", null)
cursor.use { c ->
    if (c!!.moveToFirst()) {
        do {
            val index = c.getColumnIndex(columnName)
            val value = c.getString(index)
         } while (c.moveToNext())
     }
}

我制作了一些演示应用程序https://github.com/YablokovDmitry/DatabaseView/