【问题标题】:The application does not read a downloaded Room database file until I delete the additional -wal and -shm files在我删除附加的 -wal 和 -shm 文件之前,应用程序不会读取下载的 Room 数据库文件
【发布时间】:2021-09-28 20:22:51
【问题描述】:

到目前为止的过程:

我制作了一个数据库文件,并将其上传到 Firebase 存储,然后我将文件下载到设备中应用程序的数据文件夹中。现在通过 Room 数据库访问文件时,表显示为空。

我尝试了不同的方法来解决这个问题,最后我发现问题在于 Room 数据库自动生成的带有 -wal 和 -shm 结尾的文件。从 Firebase 存储下载文件时,生成的主数据库文件会被覆盖,因此这不是问题。从应用程序的data文件夹中删除-wal和-shm文件后,应用程序显示正确的内容。

问题是:

如何让应用程序读取下载的文件而不需要删除 -wal 和 -shm 文件?或者我怎样才能让应用程序在记下下载文件中的内容后生成这些文件?

我包括将数据库复制到数据文件夹中的方法。

private void downloadMasterDatabase(){
        StorageReference pathReference = storageRef.child("master database" + "/master_table");
        String masterDbPath = "/data/data/"+ getPackageName() + "/databases/master_table";
        File masterDbFile = new File(masterDbPath);
        pathReference.getFile(masterDbFile).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();
            }
        });
    }

【问题讨论】:

    标签: java android android-room


    【解决方案1】:

    在下载数据库文件之前,您打开了数据库,但没有关闭它。那将无法可靠地工作。请注意,这包括打开数据库,然后只允许终止您的应用程序的进程。

    所以,请执行以下操作:

    • 打开数据库
    • 关闭数据库,这应该会自动删除-wal-shm 文件
    • 确认-wal-shm 文件不再存在
    • 用下载的副本替换数据库文件

    如何让应用程序读取下载的文件而不需要删除 -wal 和 -shm 文件?

    这行不通,抱歉。

    或者我怎样才能让应用程序在记下下载文件中的内容后生成这些文件?

    在将下载的数据库复制到适当位置并打开之前,关闭数据库,并且这些文件不再存在。

    FWIW,this sample project 演示了备份和恢复数据库。它碰巧使用本地副本(通过存储访问框架)而不是下载,但原理是一样的。

    【讨论】:

    • 感谢您的回答!现在在研究了如何关闭 Room Database 实例并检查了您的示例项目之后,我了解到基本上首先您获取 Room Database 的实例,然后检查它是否打开,如果它打开则关闭它。虽然我可能做错了什么,因为我似乎无法关闭它。我会过一遍步骤。 1)获取数据库实例masterDatabase = MasterDatabase.getInstance(getApplicationContext()); 2)用if (masterDatabase.isOpen()){ }检查数据库是否打开 3)如果打开,调用masterDatabase.close();
    • @EdwardAarma:“我似乎无法关闭它”——你能解释一下你的意思吗?
    • 所以通过前面评论中提到的步骤,然后它应该关闭数据库实例并删除 -wal 和 -shm 文件,但这些文件仍然存在,我认为这意味着数据库没有关闭。
    • @EdwardAarma:您是如何查找这些文件的?也许它没有以您期望的方式更新。例如,使用设备文件资源管理器,您需要手动“同步”。除此之外,如果您运行我的示例,您会得到相同的结果吗?
    • 我现在可以使用它了,非常感谢您的帮助,这对我来说很重要。
    猜你喜欢
    • 2018-10-26
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2021-10-02
    相关资源
    最近更新 更多