【问题标题】:Android Q: SQLite database in scoped storageAndroid Q:范围存储中的 SQLite 数据库
【发布时间】: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 可用于数据库文件恢复。

标签: java android sqlite kotlin android-sqlite


【解决方案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 levelAndroid Q Scoped Storage: Best Practices and Updates
  • @Merov 是的,它终于来了。世界末日
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多