众所周知,在Android Q(API=29)中,谷歌再次改变了访问外部存储器(external storage)的规则,引入了Scoped Storage的概念。现在:
默认情况下,面向 Android 10(API 级别 29)及更高版本的应用会获得对外部存储或范围存储的范围访问权限。此类应用程序只能访问外部存储上特定于应用程序的目录,以及应用程序创建的特定类型的媒体。
我有一个应用程序使用 SQLite 数据库中的用户数据存储,该数据库位于外部存储器中。这是故意这样做的,因为根据之前的评论,有很多用户抱怨,当应用程序被拆除时,内部存储器(目录android/android/[пакет приложения]/files
)中的数据也被破坏了。当然,该应用程序有能力备份数据和所有这些,但用户通常会忽略它。
结果,有一次我决定将数据存储在/Documents
由方法返回的目录中,该方法Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
在 API 29 中被声明为已弃用
注意问题:SQLiteOpenHelper
我需要做什么才能使用通常提供的访问存储在外部存储器中的 SQLite 数据库android:targetSdkVersion="29"
?
更新
开放意味着使用标准设计:
SQLiteDatabase db=SQLiteDatabase.openDatabase(file.getPath(),
null,
SQLiteDatabase.OPEN_READWRITE);
Android 10 添加了一个属性
<application>
hasFragileUserData
也就是说,如果设置了该值,
true
用户将可以选择是否与应用程序一起删除数据。当然,我想要更多:一些设置(以免考虑将临时文件推到哪里,以免它们保持自重并用它们的大小吓到用户)并且该复选框默认或选择启用.. .
需要这个选项是很久以前添加的 - 许多开发人员原则上只是因为没有它而爬进外部存储器。
不幸的是,该属性对 API 早于 29 的设备没有影响。
添加到清单:
谷歌不会再好了,它会继续拧紧螺丝,使用本地目录中的数据库,退出活动时,通过Uri备份到U盘。