From 6f24e42d1ff54f1767d4b6c4700ee54825137524 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Wed, 1 Jan 2020 09:40:35 -0600 Subject: [PATCH] Disable write-ahead log on SQLite Android 9 (Pie) silently introduced a new behavior where new SQLite databases have Write-Ahead Logs (WALs) enabled by default. The data, even after committed, is not written to the main database file until later. This caused a silent bug leading to data loss, where exported backups would either be empty or miss some recent data. --- .../main/java/org/isoron/uhabits/HabitsDatabaseOpener.kt | 7 +++++++ .../main/java/org/isoron/uhabits/tasks/ExportDBTask.java | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsDatabaseOpener.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsDatabaseOpener.kt index ba3c5565d..6bc86eaaa 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsDatabaseOpener.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsDatabaseOpener.kt @@ -34,13 +34,20 @@ class HabitsDatabaseOpener( ) : SQLiteOpenHelper(context, databaseFilename, null, version) { override fun onCreate(db: SQLiteDatabase) { + db.disableWriteAheadLogging() db.version = 8 onUpgrade(db, -1, version) } + override fun onOpen(db: SQLiteDatabase) { + super.onOpen(db) + db.disableWriteAheadLogging() + } + override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + db.disableWriteAheadLogging() if (db.version < 8) throw UnsupportedDatabaseVersionException() val helper = MigrationHelper(AndroidDatabase(db)) helper.migrateTo(newVersion) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java index b74c33915..fc528849e 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java @@ -66,7 +66,7 @@ public class ExportDBTask implements Task } catch (IOException e) { - e.printStackTrace(); + throw new RuntimeException(e); } }