# Room-Migrationen – Entwickler-Leitfaden ## Grundsatz Ab Version 6 nutzt die App **Room @AutoMigration** für Schema-Änderungen. Room generiert die Migrationen automatisch – User müssen nichts tun. `fallbackToDestructiveMigration()` ist als Fallback aktiv: Kann Room keine automatische Migration ableiten, wird die DB zurückgesetzt und neu erstellt. ## Aktuelle DB-Version **Version 6** (Stand: Mai 2026) Historische manuelle Migrationen (v1–v5) wurden entfernt. Keine Rückwärtskompatibilität zu älteren DB-Versionen. ## Checkliste für neue Schema-Änderungen 1. **DB-Version hochzählen**: `version` in `BollwerkDatabase` anpassen 2. **@AutoMigration ergänzen**: `autoMigrations = [AutoMigration(from = X, to = Y)]` in der `@Database`-Annotation 3. **Falls AutoMigration nicht reicht** (z.B. Column-Rename, Table-Rebuild): - `@RenameColumn` / `@DeleteColumn` AutoMigrationSpec schreiben - Oder manuelle `Migration(X, Y)` in `Migrations.kt` + `DatabaseModule.addMigrations()` 4. **Schema-Export prüfen**: JSON in `app/schemas/` wird automatisch generiert ## Beispiel: Einfache Spalte hinzufügen ```kotlin // BollwerkDatabase.kt @Database( entities = [...], version = 7, autoMigrations = [AutoMigration(from = 6, to = 7)], exportSchema = true ) ``` Fertig – Room erkennt die neue Spalte automatisch. ## Beispiel: Spalte umbenennen ```kotlin @Database( entities = [...], version = 7, autoMigrations = [AutoMigration(from = 6, to = 7, spec = V6ToV7::class)], exportSchema = true ) abstract class BollwerkDatabase : RoomDatabase() { @RenameColumn(tableName = "items", fromColumnName = "old_name", toColumnName = "new_name") class V6ToV7 : AutoMigrationSpec } ``` ## 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") } ``` ## E2EE – Bekannte Einschränkungen ### Pending Messages im lokalen SQLite-Speicher Nachrichten, die noch nicht erfolgreich an den Server gesendet wurden (Offline-Zustand), werden temporär als **Klartext** in der lokalen Room-Datenbank (`messages`-Tabelle, `is_pending = true`) gespeichert. Dies entspricht dem Standardverhalten von Offline-First E2EE-Messaging-Apps (z. B. Signal). **Sicherheitsbeurteilung:** Die Room-Datenbank liegt im App-privaten Verzeichnis (`/data/data/de.bollwerk.app/databases/`). Auf normalen (nicht gerooteten) Geräten ist sie für andere Apps nicht zugänglich. Ein Angreifer mit physischem Zugriff auf ein gerootetes Gerät oder ADB-Zugriff (Developer Mode) könnte die Pending-Message-Klartexte theoretisch auslesen. **Geplante Maßnahme:** Verschlüsselung der lokalen Message-DB mit SQLCipher (zukünftiges Feature).