Java 如何使用作用域存储通过外部存储中的Room写入SQLite文件?

Java 如何使用作用域存储通过外部存储中的Room写入SQLite文件?,java,android,sqlite,android-external-storage,Java,Android,Sqlite,Android External Storage,我们的应用程序要求之一是保留和备份一些SQLite文件,即使卸载了应用程序 我们通过Room将SQLite文件写入位置Environment.getExternalStorageDirectory 具有可自定义SQLite文件路径的RoomDatabase 函数返回Environment.getExternalStorageDirectory 如何通过外部存储中的文件室保存SQLite文件 根据,我的理解是,Environment.getExternalStorageDirectory可能不再可

我们的应用程序要求之一是保留和备份一些SQLite文件,即使卸载了应用程序

我们通过Room将SQLite文件写入位置
Environment.getExternalStorageDirectory

具有可自定义SQLite文件路径的RoomDatabase 函数返回Environment.getExternalStorageDirectory 如何通过外部存储中的文件室保存SQLite文件 根据,我的理解是,
Environment.getExternalStorageDirectory
可能不再可用(对吗??)

我的猜测是,为了实现相同的行为,我可能需要使用
MediaStore.Downloads
?但是怎么做呢

有人能为上述用例提供一个具体的例子吗?或者,我们不再可能实现这种行为,在作用域存储下?

如上所述,在卸载应用程序时,位于外部存储中的文件将被删除。因此,您可能会考虑使用函数将文件存储在顶级共享存储中。如果要存储在目录中,可以使用以下命令获取目录路径

File path = Environment.getExternalStoragePublicDirectory(
        Environment. DIRECTORY_DOWNLOADS);

希望这能有所帮助。

来自我自己使用Q beta 2 emulator的实验,以及带有
targetSdkVersion'Q'
的测试应用程序:

最初
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u DOWNLOADS).exists()
是假的,这让我相信你甚至不能在Q中访问它。然后我发现
mkdirs()
起作用了,然后我可以读写这个文件夹的沙盒视图,该视图仅限于我的应用程序文件。这有一个有趣的副作用,即多个应用程序可以将同名文件写入“下载”文件夹,这就是它们在emulator上的默认文件应用程序中的显示方式

正如文档中提到的,卸载后重新安装后,您将无法访问自己的文件。因此,为了在卸载后从下载中恢复sqlite文件,您必须:

  • “允许用户使用系统的文件选择器应用程序选择文件。”(来自文档)
  • 这将为您提供一个URI,而不是一个文件。由于
    SQLiteDatabase
    只能读取
    文件
    s,因此您需要将URI作为流打开,并将其写入您控制的某个真实文件中,例如缓存或内部存储

这是一种痛苦,但对于大多数用例来说是可行的。对于存储在实际SD卡上的非常大的数据库文件,例如可能有数百mb或更多的mapbox磁贴,这会变得很棘手,因为它们不适合常规的“外部”存储。

我不是说这些。我在谈论即将推出的Android Q范围存储。我想我理解你的问题。在我看来,将文件保存在
MediaStore.Download
中与使用
getExternalStoragePublicDirectory
功能将文件存储在
目录中一样。虽然你分享的博客没有说太多。如果我又错了,请告诉我。谢谢你的提示。您是否知道我们如何(或是否可能)将多个图像文件复制到共享集合下载谢谢
public static String getBackupDirectory() {
    if (backupDirectory == null) {
        File _externalStorageDirectory = Environment.getExternalStorageDirectory();
        if (_externalStorageDirectory == null) {
            return null;
        }

        try {
            backupDirectory = _externalStorageDirectory.getCanonicalPath();
        } catch (IOException e) {
            Log.e(TAG, "", e);
        }

        if (backupDirectory == null) {
            return null;
        }

        backupDirectory = toEndWithFileSeperator(backupDirectory) + "com.yocto.wenote" + File.separator + "backup" + File.separator;
    }

    return backupDirectory;
}
LocalBackupNamedRoomDatabase.newInstance(
    getBackupDirectory() + "local-backup"
).backupDao().insert(backup)
File path = Environment.getExternalStoragePublicDirectory(
        Environment. DIRECTORY_DOWNLOADS);