#qrcode-Container nutzt jetzt display:flex + justify-content:center statt margin:0 auto, damit das von QRCode.js generierte Canvas korrekt mittig angezeigt wird.
79 lines
2.7 KiB
Markdown
79 lines
2.7 KiB
Markdown
# 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")
|
||
}
|
||
```
|