# Room-Migrationen – Entwickler-Leitfaden ## Grundsatz **`fallbackToDestructiveMigration()` ist verboten.** Jede Schema-Änderung muss durch eine explizite Migration abgedeckt sein, damit User-Daten bei App-Updates erhalten bleiben. ## Aktuelle DB-Version **Version 4** (Stand: Mai 2026) | Migration | Änderung | | --------- | ----------------------------------------------------- | | v1 → v2 | `kcal_per_100g` → `kcal_per_kg`, `min_stock` entfernt | | v2 → v3 | Tabelle `pending_sync_ops` hinzugefügt | | v3 → v4 | Tabelle `messages` hinzugefügt | ## Checkliste für neue Schema-Änderungen 1. **Migration schreiben**: Neues `Migration(X, Y)`-Objekt in `Migrations.kt` ergänzen 2. **DB-Version hochzählen**: `version` in `KrisenvorratDatabase` anpassen 3. **Migration registrieren**: In `DatabaseModule.addMigrations()` eintragen 4. **Test schreiben**: Migrationspfad in `KrisenvorratDatabaseMigrationTest` testen 5. **Pflichtfelder**: Bei neuen Pflichtfeldern ohne sinnvollen Default → interaktiven MigrationScreen ergänzen ## Migration schreiben ```kotlin // In Migrations.kt val MIGRATION_4_5 = object : Migration(4, 5) { override fun migrate(db: SupportSQLiteDatabase) { // SQL-Statements für die Schema-Änderung db.execSQL("ALTER TABLE items ADD COLUMN new_column TEXT NOT NULL DEFAULT ''") } } ``` ### Wichtige SQLite-Einschränkungen - **ALTER TABLE RENAME COLUMN** erst ab SQLite 3.25 (Android API 29). Bei minSdk < 29: Tabelle neu erstellen, Daten kopieren, alte Tabelle löschen, neue umbenennen. - **ALTER TABLE DROP COLUMN** erst ab SQLite 3.35 (Android API 34). Gleiche Workaround-Strategie. - **Immer `CREATE TABLE IF NOT EXISTS`** für neue Tabellen verwenden. - **Indizes** nach Table-Rebuild neu erstellen (`CREATE INDEX IF NOT EXISTS`). ## Tests schreiben Jede Migration braucht mindestens: 1. **Schema-Test**: Prüfen, dass neue Spalten/Tabellen existieren und alte entfernt sind 2. **Daten-Test**: Prüfen, dass bestehende Daten nach der Migration erhalten sind 3. **Full-Path-Test**: Prüfen, dass v1 → aktuelle Version ohne Fehler durchläuft ```kotlin @Test fun migrate4To5_newColumnExists() { createV4Database() val db = openMigratedDbV5() try { // Schema prüfen // Daten prüfen } finally { db.close() } } ``` ## Schema-Export Room exportiert Schemas automatisch nach `app/schemas/`. Diese JSON-Dateien werden versioniert und können für `MigrationTestHelper` verwendet werden. Konfiguration in `app/build.gradle.kts`: ```kotlin ksp { arg("room.schemaLocation", "$projectDir/schemas") } ```