首页 > 解决方案 > 在我删除额外的 -wal 和 -shm 文件之前,应用程序不会读取下载的 Room 数据库文件

问题描述

到目前为止的过程:

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

我尝试了不同的方法来解决这个问题,最后我发现问题是 Room 数据库自动生成的带有 -wal 和 -shm 结尾的文件。从 Firebase 存储下载文件时,生成的主数据库文件会被覆盖,因此这不是问题。从应用程序的数据文件夹中删除 -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();
            }
        });
    }

标签: javaandroidandroid-room

解决方案


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

因此,请执行以下操作:

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

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

那是行不通的,对不起。

或者在记下下载文件中的内容后,如何让应用程序生成这些文件?

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

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


推荐阅读