Android Q: base de datos SQLite en almacenamiento con ámbito

13

En Android Q introdujo la nueva función de almacenamiento Scoped , que dice:

las aplicaciones que se dirigen a Android 10 (API nivel 29) y superior tienen acceso con alcance en almacenamiento externo, o almacenamiento con alcance, de forma predeterminada. Dichas aplicaciones solo tienen acceso al directorio específico de la aplicación en el almacenamiento externo, así como a tipos específicos de medios que la aplicación ha creado.

Tengo mi aplicación que crea una base de datos SQLite en el almacenamiento externo, de modo que cuando la aplicación desinstala la base de datos sigue viva y se puede usar más tarde como recuperación o se puede usar fuera del dispositivo Android (digamos en la PC)

¿Cómo debería lograr el mismo efecto con Android Q? Más precisamente si la base de datos está almacenada en un directorio público externo, ¿cómo puedo leer esta base de datos usando el estándar SQLiteOpenHelper?

Barmaley Red Star
fuente
No puede, al menos no con el marco SQLite o el soporte SQLite AndroidX API (el utilizado por Room). No puedo descartar alguna solución oscura usando una biblioteca SQLite compilada a medida y tal vez un descriptor de archivo.
CommonsWare
No no. noo-oooo-oooo! No puedo creerlo, tiene que haber una manera de usar la base de datos SQLite colocada en el directorio público ...
Barmaley Red Star
Al iniciar y cerrar la aplicación, puede hacer una copia del archivo de la base de datos. Usando la tienda de medios no necesita permisos.
blackapps
@blackapps, seguro que entiendo esta opción, aunque me alegraría tener otro enfoque también: acceso directo a la base de datos SQLite en almacenamiento externo
Barmaley Red Star
AutoBackup se puede usar para la recuperación de archivos de base de datos.
Arte

Respuestas:

3

Podría intentar usar la solución de los documentos:
https://developer.android.com/training/data-storage/compatibility

  • Apunte a Android 9 (nivel de API 28) o inferior.
  • Si te orientas a Android 10 (nivel de API 29) o superior, establece el valor de requestLegacyExternalStoragea trueen el archivo de manifiesto de tu aplicación:
<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android 10 or higher. -->
    <application android:requestLegacyExternalStorage="true" ... >
    ...
    </application>
</manifest>
Merov
fuente
Parece que es la mejor solución, aunque me encantaría encontrar otra solución. Me temo que algún tiempo android:requestLegacyExternalStoragedesaparecerá ...
Barmaley Red Star
Sobre desaparecer tal como lo entiendo, no esperaremos demasiado. Scoped Storage will be required in next year’s major platform release for all apps, independent of target SDK level. Android Q Scoped Storage: mejores prácticas y actualizaciones
Merov