Android Q: база данных SQLite в области хранения

13

В Android Q введена новая функция хранения Scoped , которая гласит:

приложениям, ориентированным на Android 10 (уровень API 29) и выше, по умолчанию предоставляется доступ с ограничением во внешнее хранилище или хранилище с областью действия. Такие приложения имеют доступ только к каталогу конкретного приложения на внешнем хранилище, а также к определенным типам носителей, созданных приложением.

У меня есть приложение, которое создает базу данных SQLite на внешнем хранилище, так что, когда приложение удаляет базу данных, которая еще жива, и может быть использована позже для восстановления или использования вне устройства Android (скажем, на ПК)

Как мне добиться того же эффекта с Android Q? Точнее, если база данных хранится во внешнем публичном каталоге - как я могу читать эту базу данных, используя стандарт SQLiteOpenHelper?

Бармалей Красная Звезда
источник
Вы не можете, по крайней мере, не с фреймворком SQLite или поддержкой SQLite AndroidX API (тот, который используется Room). Я не могу исключить какое-то неясное решение, использующее специально скомпилированную библиотеку SQLite и, возможно, файловый дескриптор.
CommonsWare
Нет нет. Ноо-оооо-оооо! Я не могу поверить, должен быть способ использовать базу данных SQLite, помещенную в публичный каталог ...
Barmaley Red Star
При запуске и закрытии приложения вы можете сделать копию файла базы данных. Использование медиа-магазина вам не нужно никаких разрешений.
Blackapps
@blackapps, конечно, я понимаю эту опцию, хотя я был бы рад иметь и другой подход: прямой доступ к базе данных SQLite на внешнем хранилище
Barmaley Red Star
AutoBackup можно использовать для восстановления файлов базы данных.
статья

Ответы:

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>
Merov
источник
Похоже, это лучшее решение, хотя я был бы рад найти другое решение. Я просто боюсь, что через некоторое время 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: лучшие практики и обновления
Меров