В Android Pie + SQLite по умолчанию заменено на использование в общем более эффективного ведения журнала записи вперед ( WAL ) вместо режима журнала.
Таким образом, будут два файла с тем же именем, что и у базы данных, но с суффиксами -shm (файл с общей памятью) и -wal (журнал записи вперед) и их наличие. это то, что я считаю, вызывает проблему (ы).
Временные файлы, используемые SQLite (см. 2.2 и 2.3)
Одним из исправлений было бы отключение записи в журнал впереди с использованием метода SQliteDatabase disableWriteAheadLogging , и предыдущий метод работал бы так же, как и раньше, но с менее эффективным режимом журнала.
- (при использовании подкласса SQliteOpenHelper затем переопределить метод onConfigure для вызова этого метода.) disableWriteAheadLogging .
Другим исправлением является удаление этих двух файлов при восстановлении. Чтобы избежать возможного повреждения, вы должны убедиться, что база данных была должным образом проверена перед созданием резервной копии. см. контрольная точка PRAGMA;
Ниже приведен фрагмент, который удаляет эти два файла при восстановлении (отмечая, что резервное копирование предположительно было выполнено с соответствующей контрольной точкой): -
// Added for Android 9+ to delete shm and wal file if they exist
File dbshm = new File(dbfile.getPath() + "-shm");
File dbwal = new File(dbfile.getPath()+ "-wal");
if (dbshm.exists()) {
dbshm.delete();
}
if (dbwal.exists()) {
dbwal.delete();
}
Другим исправлением будет дополнительное резервное копирование и последующее восстановление файлов -shm и -wal.
Вы можете также пожелать рассмотреть потенциальные преимущества переименования исходных файлов при импорте / восстановлении, проверки новых файлов после их копирования (например, с использованием PRAGMA целостность_чека; ), если результаты указывают Нет проблем, затем удалите переименованные исходные файлы, в противном случае удалите импортированные файлы и переименуйте исходные файлы в их исходное имя, указывая, что импорт не удался.