Файл базы данных FileOutputStream wit больше не работает на Android 9 - PullRequest
0 голосов
/ 13 сентября 2018

Если пользователь запрашивает восстановление данных, я делаю восстановление с внутренней SD-карты в каталог данных приложений с помощью FileInputStream и FileOutputStream.

Это работает на Android 8 и ниже, но с Android 9 больше не работает. Я не получаю никакой безопасности или других связанных исключений.
Он завершился без ошибок, но данные (база данных) все еще старые со старыми записями.

Вот как я пишу файл базы данных:

byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer)) > 0) {
        output.write(buffer, 0, length);
}

input = FileInputStream пути '/storage/emulated/0/appname/backupAuto_180913120029.db' output = FileOutputStream пути '/data/user/0/packagename/databases/data.db'

        output.flush();
        output.close();
        input.close();

UPDATE:
Если я переношу после записи / восстановления файл data.db с устройства и открою его с помощью SQLLite Tool, я увижу правильные данные.
Но приложение по-прежнему отображает старые данные. Неважно что я делаю.

Я использую ContentProvider и внутри getReadableDatabase (), но, похоже, я всегда получаю кэшированную или старую базу данных.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Решение без отключения WAL.

Android 9 представляет специальный режим SQLiteDatabase под названием Совместимость WAL (loggin упреждающий вход), который позволяет базе данных использовать«journal_mode = WAL», сохраняя при этом поведение не более одного соединения на базу данных.

Подробно здесь:
https://source.android.com/devices/tech/perf/compatibility-wal

Режим SQLite WAL подробно описан здесь:
https://www.sqlite.org/wal.html

Начиная с официальных документовВ режиме WAL добавляется второй файл базы данных с именами databasename и "-wal".Поэтому, если ваша база данных называется «data.db», она называется «data-wal.db» в том же каталоге.

Решение теперь заключается в сохранении и восстановлении ОБА файлы (data.db и data-wal.db) на Android 9.

После этого он работает как в предыдущих версиях.

0 голосов
/ 31 октября 2018

Я нахожу ответ по адресу:

Android P - «SQLite: нет такой ошибки таблицы» после копирования базы данных из ресурсов

решил проблему, добавив ее вмой SQLiteOpenHelper:

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    db.disableWriteAheadLogging();
}
...