Android Q:作用域存储中的SQLite数据库

17

在Android Q中引入了新的Scoped storage功能,它指出:

针对 Android 10 (API 级别29) 及更高版本的应用程序默认具有对外部存储或 scoped 存储的受限访问权限。这样的应用程序只能访问外部存储上的特定类型的媒体和应用程序特定目录中创建的特定类型的媒体。

我有一个应用程序在外部存储上创建 SQLite 数据库,因此当应用程序被卸载时,数据库仍然存在并可以稍后用作恢复或在 Android 设备之外使用(比如在 PC 上)

在 Android Q 上,我应该如何实现相同的效果?更具体地说,如果数据库存储在外部公共目录中,我如何使用标准的SQLiteOpenHelper读取此数据库?


你不能这样做,至少不可以使用SQLite框架或支持SQLite AndroidX API(Room所使用的API)。我不能排除使用自定义编译的SQLite库和文件描述符的某些模糊解决方案。 - CommonsWare
不行,不行,不行!我不敢相信,一定有办法使用放置在公共目录中的SQLite数据库... - Barmaley
在您的应用程序启动和关闭时,您可以复制数据库文件。使用媒体存储库无需权限。 - blackapps
@blackapps,我明白这个选项,但如果有其他方法的话,我会很高兴直接访问外部存储上的SQLite数据库。 - Barmaley
AutoBackup 可用于数据库文件恢复。 - art
很不幸,自动备份的大小太小了,我的用户通常会存储高达1GB的个人数据... - Barmaley
1个回答

5
您可以尝试使用文档中提供的解决方案:
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
1
据我所知,关于消失,我们不会等太久。在下一年的主要平台发布中,无论目标SDK级别如何,所有应用程序都将需要使用Scoped Storage。 Android Q Scoped Storage: 最佳实践和更新 - Merov
1
@Merov 是的,它终于来了。末日 - M D P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接