Java 如何使用作用域存储通过外部存储中的Room写入SQLite文件?
我们的应用程序要求之一是保留和备份一些SQLite文件,即使卸载了应用程序 我们通过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可能不再可
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);