Android Q: banco de dados SQLite no armazenamento com escopo

13

No Android Q, introduzimos o novo recurso de armazenamento com escopo , que diz:

os aplicativos que segmentam o Android 10 (nível 29 da API) e superior recebem acesso com escopo no armazenamento externo, ou armazenamento com escopo, por padrão. Esses aplicativos têm acesso apenas ao diretório específico do aplicativo no armazenamento externo, bem como tipos específicos de mídia que o aplicativo criou.

Eu tenho meu aplicativo que cria banco de dados SQLite no armazenamento externo, de modo que quando o aplicativo desinstala o banco de dados ainda ativo e pode ser usado posteriormente como recuperação ou usado fora do dispositivo Android (digamos no PC)

Como devo obter o mesmo efeito com o Android Q? Mais precisamente se o banco de dados estiver armazenado em diretório público externo - como posso ler esse banco de dados usando o padrão SQLiteOpenHelper?

Barmaley Red Star
fonte
Você não pode, pelo menos não com a estrutura SQLite ou a API SQLite AndroidX de suporte (a usada pelo Room). Não posso descartar alguma solução obscura usando uma biblioteca SQLite compilada personalizada e talvez um descritor de arquivo.
CommonsWare
Não não. noo-oooo-oooo! Eu não posso acreditar, tem que haver uma maneira de usar o banco de dados SQLite colocado no diretório público ...
Barmaley Red Star
Ao iniciar e desligar o aplicativo, você pode fazer uma cópia do arquivo do banco de dados. Usando o armazenamento de mídia, você não precisa de permissões.
blackapps 10/01
@blackapps, com certeza eu entendo essa opção, embora eu também tenha prazer em ter outra abordagem: acesso direto ao banco de dados SQLite em armazenamento externo
Barmaley Red Star
O AutoBackup pode ser usado para recuperação de arquivos de banco de dados.
art

Respostas:

3

Você pode tentar usar a solução nos documentos:
https://developer.android.com/training/data-storage/compatibility

  • Segmente o Android 9 (nível 28 da API) ou inferior.
  • Se você segmentar o Android 10 (API nível 29) ou superior, defina o valor de requestLegacyExternalStoragecomo trueno arquivo de manifesto do seu aplicativo:
<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android 10 or higher. -->
    <application android:requestLegacyExternalStorage="true" ... >
    ...
    </application>
</manifest>
Merov
fonte
Parece que é a melhor solução, embora eu fique feliz em encontrar outra solução. Só tenho medo de que algum tempo android:requestLegacyExternalStoragedesapareça ...
Barmaley Red Star
Sobre desaparecer como eu o entendo, não vamos esperar muito. Scoped Storage will be required in next year’s major platform release for all apps, independent of target SDK level. Armazenamento com escopo Q do Android: práticas recomendadas e atualizações
Merov 19/01