Android Q: baza danych SQLite w pamięci z zakresem


13

W Androidzie Q wprowadzono nową funkcję przechowywania Scoped , która mówi:

aplikacje, które są ukierunkowane na system Android 10 (poziom API 29) i wyższy, mają domyślnie dostęp do pamięci zewnętrznej lub pamięci masowej o zasięgu. Takie aplikacje mają dostęp tylko do katalogu specyficznego dla aplikacji w pamięci zewnętrznej, a także do określonych rodzajów multimediów utworzonych przez aplikację.

Mam swoją aplikację, która tworzy bazę danych SQLite w pamięci zewnętrznej, na przykład, gdy aplikacja odinstalowuje bazę danych i nadal może być używana jako odzyskiwanie lub poza urządzeniem z Androidem (powiedzmy na PC)

Jak powinienem osiągnąć ten sam efekt w Androidzie Q? Dokładniej, jeśli baza danych jest przechowywana w zewnętrznym katalogu publicznym - jak mogę odczytać tę bazę danych przy użyciu standardu SQLiteOpenHelper?


Nie możesz, przynajmniej nie z frameworkowym SQLite lub obsługującym API SQLite AndroidX (tym używanym przez Room). Nie mogę wykluczyć jakiegoś niejasnego rozwiązania za pomocą skompilowanej biblioteki SQLite i być może deskryptora pliku.
CommonsWare

Nie? Nie. noo-oooo-oooo! Nie mogę uwierzyć, musi istnieć sposób na użycie bazy danych SQLite umieszczonej w katalogu publicznym ...
Barmaley Red Star

Podczas uruchamiania i zamykania aplikacji możesz wykonać kopię pliku bazy danych. Korzystanie ze sklepu medialnego nie wymaga żadnych uprawnień.
blackapps

@blackapps, na pewno rozumiem tę opcję, choć chętnie skorzystam również z innego podejścia: bezpośredni dostęp do bazy danych SQLite w pamięci zewnętrznej
Barmaley Red Star

Automatycznej kopii zapasowej można używać do odzyskiwania plików bazy danych.
art.

Odpowiedzi:


3

Możesz spróbować użyć rozwiązania z dokumentacji:
https://developer.android.com/training/data-storage/compatibility

  • Kieruj na Androida 9 (poziom API 28) lub niższy.
  • Jeśli kierujesz reklamy na Androida 10 (poziom API 29) lub wyższy, ustaw wartość requestLegacyExternalStoragena truew pliku manifestu aplikacji:
<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android 10 or higher. -->
    <application android:requestLegacyExternalStorage="true" ... >
    ...
    </application>
</manifest>

Wygląda na to, że to najlepsze rozwiązanie, choć chętnie znajdę inne rozwiązanie. Obawiam się, że kiedyś android:requestLegacyExternalStoragezniknie ...
Barmaley Red Star

O zniknięciu w moim rozumieniu nie będziemy długo czekać. Scoped Storage will be required in next year’s major platform release for all apps, independent of target SDK level. Android Q Scope Storage: najlepsze praktyki i aktualizacje
Merov
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.