Android Q: database SQLite in archiviazione con ambito


13

In Android Q è stata introdotta la nuova funzionalità di archiviazione con ambito, che dice:

le app destinate ad Android 10 (livello API 29 e successive) ricevono l'accesso con ambito alla memoria esterna o alla memoria con ambito, per impostazione predefinita. Tali app hanno accesso solo alla directory specifica dell'app su memoria esterna, nonché a tipi specifici di media creati dall'app.

Ho la mia app che crea il database SQLite su memoria esterna, in modo tale che quando l'app disinstalla il database è ancora viva e può essere utilizzata in seguito come ripristino o essere utilizzata al di fuori del dispositivo Android (diciamo nel PC)

Come devo ottenere lo stesso effetto con Android Q? Più precisamente se il database è archiviato in una directory pubblica esterna - come posso leggere questo database usando lo standard SQLiteOpenHelper?


Non è possibile, almeno non con il framework SQLite o l'API AndroidX SQLite di supporto (quella utilizzata da Room). Non posso escludere alcune soluzioni oscure che utilizzano una libreria SQLite compilata su misura e forse un descrittore di file.
CommonsWare il

No noo-oooo-oooo! Non posso credere, ci deve essere un modo per utilizzare il database SQLite inserito nella directory pubblica ...
Barmaley Red Star

All'avvio e allo spegnimento della tua app potresti creare una copia del file di database. Utilizzando il media store non hai bisogno di autorizzazioni.
Blackapps

@blackapps, sicuro di aver capito questa opzione, anche se sarei felice di avere anche un altro approccio: accesso diretto al database SQLite su memoria esterna
Barmaley Red Star

AutoBackup può essere utilizzato per il recupero di file di database.
art

Risposte:


3

Puoi provare a utilizzare la soluzione dai documenti:
https://developer.android.com/training/data-storage/compatibility

  • Target Android 9 (livello API 28) o inferiore.
  • Se scegli come target Android 10 (livello API 29 o superiore), imposta il valore di requestLegacyExternalStoragea truenel file manifest della tua app:
<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android 10 or higher. -->
    <application android:requestLegacyExternalStorage="true" ... >
    ...
    </application>
</manifest>

Sembra che sia la soluzione migliore, anche se sarei felice di trovare un'altra soluzione. Ho solo paura che un po 'di tempo android:requestLegacyExternalStoragescompaia ...
Barmaley Red Star il

A proposito di scomparire, come ho capito, non aspetteremo troppo a lungo. Scoped Storage will be required in next year’s major platform release for all apps, independent of target SDK level. Archiviazione con ambito Android Q: best practice e aggiornamenti
Merov
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.