Android Q:范围存储中的SQLite数据库


13

在Android Q中引入了新的范围存储功能,该功能表示:

默认情况下,面向Android 10(API级别29)及更高版本的应用会获得对外部存储(或范围存储)的范围内访问权限。此类应用程序只能访问外部存储上特定于应用程序的目录以及该应用程序创建的特定媒体类型。

我有我的应用程序在外部存储上创建SQLite数据库,这样,当应用程序卸载数据库时,该数据库仍然有效,以后可以用作恢复功能,也可以在Android设备之外使用(例如在PC中)

如何使用Android Q达到相同的效果?更准确地说,如果数据库存储在外部公共目录中,如何使用标准读取此数据库SQLiteOpenHelper


您至少不能使用框架SQLite或支持的SQLite AndroidX API(Room使用的API)。我不能排除使用自定义编译的SQLite库以及文件描述符的一些晦涩的解决方案。
CommonsWare

不,不。不,不,不!我不敢相信,必须有一种方法可以使用放在公共目录中的SQLite数据库...
Barmaley Red Star

在启动和关闭应用程序时,您可以复制数据库文件。使用媒体存储,您不需要权限。
blackapps

@blackapps,虽然我很高兴也可以采用其他方法,但我当然也理解此选项:直接访问外部存储上的SQLite数据库
Barmaley Red Star

自动备份可用于数据库文件恢复。
艺术

Answers:


3

您可以尝试使用以下文档中的解决方案:https :
//developer.android.com/training/data-storage/compatibility

  • 定位到Android 9(API级别28)或更低。
  • 如果定位到Android设备10(API级别29)或更高,设置的值requestLegacyExternalStorage,以true在您的应用程序的清单文件:
<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android 10 or higher. -->
    <application android:requestLegacyExternalStorage="true" ... >
    ...
    </application>
</manifest>

看起来,这是最好的解决方案,尽管我很乐意找到其他解决方案。我只是担心一段时间android:requestLegacyExternalStorage会消失...
Barmaley Red Star

据我所知,关于消失,我们不会等待太久。 Scoped Storage will be required in next year’s major platform release for all apps, independent of target SDK levelAndroid Q范围存储:最佳实践和更新
Merov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.