Android Q:范围存储中的 SQLite 数据库
Posted
技术标签:
【中文标题】Android Q:范围存储中的 SQLite 数据库【英文标题】:Android Q: SQLite database in scoped storage 【发布时间】:2020-04-28 03:43:53 【问题描述】:在 android Q 中引入了新的Scoped storage 功能,它表示:
默认情况下,面向 Android 10(API 级别 29)及更高版本的应用会获得对外部存储或范围存储的范围访问权限。此类应用只能访问外部存储上特定于应用的目录,以及应用创建的特定类型的媒体。
我的应用程序在外部存储上创建 SQLite 数据库,这样当应用程序卸载时数据库仍然存在,以后可以用作恢复或在 Android 设备之外使用(比如说在 PC 中)
我应该如何使用 Android Q 实现相同的效果?更准确地说,如果数据库存储在外部公共目录中 - 我如何使用标准 SQLiteOpenHelper
读取此数据库?
【问题讨论】:
你不能,至少不能使用 SQLite 框架或支持 SQLite AndroidX API(Room 使用的那个)。我不能排除使用自定义编译的 SQLite 库和文件描述符的一些晦涩的解决方案。 不,不。呜呜呜呜!我不敢相信,必须有一种方法可以使用放在公共目录中的 SQLite 数据库...... 在启动和关闭您的应用程序时,您可以制作数据库文件的副本。使用媒体存储不需要任何权限。 @blackapps,当然我理解这个选项,虽然我也很高兴有其他方法:直接访问外部存储上的 SQLite 数据库 AutoBackup 可用于数据库文件恢复。 【参考方案1】:您可以尝试使用文档中的解决方案: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
会消失……
关于消失,据我所知,我们不会等太久。 Scoped Storage will be required in next year’s major platform release for all apps, independent of target SDK level
。 Android Q Scoped Storage: Best Practices and Updates
@Merov 是的,它终于来了。世界末日以上是关于Android Q:范围存储中的 SQLite 数据库的主要内容,如果未能解决你的问题,请参考以下文章