From f498ecdef42e82ad2dacaa604cde7bd00995f531 Mon Sep 17 00:00:00 2001 From: Helios Date: Tue, 24 Feb 2026 16:01:07 +0100 Subject: [PATCH] fix: correct Room migration - use DEFAULT '' to match entity schema MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migration 1→2 had DEFAULT NULL but @ColumnInfo(defaultValue="") expects DEFAULT ''. Room schema validation failed on startup. Since SQLite can't alter column defaults, add migration 2→3 that recreates the alarms table with the correct DEFAULT '' for the date column. --- .../helios_alarm_clock/data/AlarmDatabase.kt | 29 +++++++++++++++++-- .../helios_alarm_clock/di/AppModule.kt | 2 +- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/example/helios_alarm_clock/data/AlarmDatabase.kt b/app/src/main/java/com/example/helios_alarm_clock/data/AlarmDatabase.kt index 551c82e..2ff82ae 100644 --- a/app/src/main/java/com/example/helios_alarm_clock/data/AlarmDatabase.kt +++ b/app/src/main/java/com/example/helios_alarm_clock/data/AlarmDatabase.kt @@ -5,16 +5,41 @@ import androidx.room.RoomDatabase import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -@Database(entities = [AlarmEntity::class], version = 2, exportSchema = true) +@Database(entities = [AlarmEntity::class], version = 3, exportSchema = true) abstract class AlarmDatabase : RoomDatabase() { abstract fun alarmDao(): AlarmDao companion object { const val NAME = "helios_alarms.db" + // Fresh install path: add date column with correct default val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(db: SupportSQLiteDatabase) { - db.execSQL("ALTER TABLE alarms ADD COLUMN date TEXT DEFAULT NULL") + db.execSQL("ALTER TABLE alarms ADD COLUMN date TEXT DEFAULT ''") + } + } + + // Fix path: first install had DEFAULT NULL instead of DEFAULT '' + // SQLite can't alter column defaults, so recreate the table + val MIGRATION_2_3 = object : Migration(2, 3) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL(""" + CREATE TABLE alarms_new ( + id TEXT NOT NULL PRIMARY KEY, + hour INTEGER NOT NULL, + minute INTEGER NOT NULL, + label TEXT NOT NULL, + triggerTimeMillis INTEGER NOT NULL, + date TEXT DEFAULT '' + ) + """.trimIndent()) + db.execSQL(""" + INSERT INTO alarms_new (id, hour, minute, label, triggerTimeMillis, date) + SELECT id, hour, minute, label, triggerTimeMillis, COALESCE(date, '') + FROM alarms + """.trimIndent()) + db.execSQL("DROP TABLE alarms") + db.execSQL("ALTER TABLE alarms_new RENAME TO alarms") } } } diff --git a/app/src/main/java/com/example/helios_alarm_clock/di/AppModule.kt b/app/src/main/java/com/example/helios_alarm_clock/di/AppModule.kt index 3d736a1..14e33e2 100644 --- a/app/src/main/java/com/example/helios_alarm_clock/di/AppModule.kt +++ b/app/src/main/java/com/example/helios_alarm_clock/di/AppModule.kt @@ -23,7 +23,7 @@ object AppModule { AlarmDatabase::class.java, AlarmDatabase.NAME ) - .addMigrations(AlarmDatabase.MIGRATION_1_2) + .addMigrations(AlarmDatabase.MIGRATION_1_2, AlarmDatabase.MIGRATION_2_3) .build() @Provides