Android 9 журнал базы данных в режиме WAL при резервном копировании - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть некоторая функция резервного копирования / восстановления внутри моего приложения, и это вызывает проблемы при использовании> = Android 9, базы данных SQLite действительно используют journal_mode WAL вместо DELETE, который они использовали на старых телефонах. Моя версия SQLLite - 3.25.2

Дополнительная информация:

Я использую Sugar ORM, который полностью интегрирован в мой проект. Sugar ORM, использующий собственные классы, например SugarDb, который расширяет SQLiteOpenHelper, а класс доступен только для чтения.

Вопросы:

  1. Как и где проверить если journal_mode равен WAL для файла * .db?
  2. Как правильно скопировать / восстановить файл * .db, если SQLite journal_mode имеет значение WAL?
  3. Как и где переключить SQLite journal_mode из ХОТИТЕ УДАЛИТЬ все карманные компьютеры?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Самый полезный способ, так как стоимость - это метод, который проверяет базу данных, упомянутую в: Резервное копирование sqlite db в режиме WAL без FileStreams // путем экспорта / резервного копирования sql команды

Спасибо всем вам за совет.

0 голосов
/ 11 апреля 2020

Некоторое хорошее фоновое чтение https://sqlite.org/wal.html

Ответ на 3. Используйте https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#disableWriteAheadLogging () в onConfigure SQLiteOpenHelper (или в вашем случае вам, вероятно, придется расширить и переопределить класс SugarDb, чтобы сделать это.

Вам, вероятно, придется также расширить getInstance, чтобы вернуть ваш экземпляр вашего собственного класса (и не вызывать super, я думаю, что в этом переопределении) ), затем, когда вы вызываете SugarDb.getInstance(), вы вызываете getInstance в расширенном классе.

Ответ на вопрос 2. Как говорит @CommonsWare, если ваша БД закрыта правильно, то все данные передаются в файл БД из Файл Wal при закрытии.

Обновление: Просмотр https://github.com/chennaione/sugar/blob/master/library/src/main/java/com/orm/SugarDb.java

Каждый раз, когда вы звоните SugarDb.getReadableDatabase() или SugarDb.getWritableDatabase() вам должен позвонить SugarDb.close()

Самый простой способ сделать это, как только вы закончите текущие операции с базой данных, так как вы не можете запросить его счетчик соединений, или вы можете поддерживать свой собственный счет и закрываться в разное время в жизненный цикл приложений, например onPause или onDestroy или до наша попытка сделать резервную копию

Ответ на вопрос 1. https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#isWriteAheadLoggingEnabled ()

...