Von SQLite zu Room migrieren

Die Room Persistence Library bietet eine Reihe von Vorteilen gegenüber der direkten Verwendung der SQLite-APIs:

  • Verifizierung während der Kompilierung von SQL-Abfragen
  • Praktische Anmerkungen, die sich wiederholenden und fehleranfälligen Boilerplate-Code minimieren
  • Optimierte Datenbankmigrationspfade

Wenn Ihre Anwendung derzeit eine Nicht-Room-Implementierung von SQLite verwendet, lesen Sie diese Seite, um zu erfahren, wie Sie Ihre App zu Room migrieren. Wenn Room die erste SQLite-Implementierung ist, die Sie in Ihrer App verwenden, finden Sie grundlegende Informationen zur Nutzung unter Daten mit Room in einer lokalen Datenbank speichern.

Migrationsschritte

Führen Sie die folgenden Schritte aus, um Ihre SQLite-Implementierung zu Room zu migrieren. Wenn Ihre SQLite-Implementierung eine große Datenbank oder komplexe Abfragen verwendet, sollten Sie eine schrittweise Migration zu Room vornehmen. Eine schrittweise Migrationsstrategie finden Sie unter Inkrementelle Migration.

Abhängigkeiten aktualisieren

Wenn Sie Room in Ihrer Anwendung verwenden möchten, müssen Sie die entsprechenden Abhängigkeiten in die Datei build.gradle der Anwendung aufnehmen. Die aktuellen Raumabhängigkeiten finden Sie unter Einrichtung.

Modellklassen auf Datenentitäten aktualisieren

Room verwendet Datenentitäten, um die Tabellen in der Datenbank darzustellen. Jede Entitätsklasse stellt eine Tabelle dar und enthält Felder, die Spalten in dieser Tabelle darstellen. Führen Sie die folgenden Schritte aus, um Ihre vorhandenen Modellklassen in Raumentitäten zu ändern:

  1. Versehen Sie die Klassendeklaration mit @Entity, um anzugeben, dass es sich um eine Raumentität handelt. Mit dem Attribut tableName können Sie optional angeben, dass der Name der resultierenden Tabelle sich vom Klassennamen unterscheiden soll.
  2. Annotieren Sie das Primärschlüsselfeld mit @PrimaryKey.
  3. Sollte eine der Spalten in der resultierenden Tabelle einen Namen haben, der sich vom Namen des entsprechenden Feldes unterscheidet, annotieren Sie das Feld mit @ColumnInfo und legen Sie das Attribut name auf den richtigen Spaltennamen fest.
  4. Wenn die Klasse Felder enthält, die nicht in der Datenbank beibehalten werden sollen, versehen Sie diese Felder mit @Ignore, um anzugeben, dass Room in der entsprechenden Tabelle keine Spalten für sie erstellen soll.
  5. Wenn die Klasse mehr als eine Konstruktormethode hat, geben Sie an, welcher Konstruktorroom verwendet werden soll, indem Sie alle anderen Konstruktoren mit @Ignore annotieren.

Kotlin

@Entity(tableName = "users")
data class User(
  @PrimaryKey
  @ColumnInfo(name = "userid") val mId: String,
  @ColumnInfo(name = "username") val mUserName: String?,
  @ColumnInfo(name = "last_update") val mDate: Date?,
)

Java

@Entity(tableName = "users")
public class User {

  @PrimaryKey
  @ColumnInfo(name = "userid")
  private String mId;

  @ColumnInfo(name = "username")
  private String mUserName;

  @ColumnInfo(name = "last_update")
  private Date mDate;

  @Ignore
  public User(String userName) {
    mId = UUID.randomUUID().toString();
    mUserName = userName;
    mDate = new Date(System.currentTimeMillis());
  }

  public User(String id, String userName, Date date) {
    this.mId = id;
    this.mUserName = userName;
    this.mDate = date;
  }

}

DAOs erstellen

Room verwendet Data Access Objects (DAOs), um Methoden für den Zugriff auf die Datenbank zu definieren. Folgen Sie der Anleitung unter Mit Raum-DAOs auf Daten zugreifen, um Ihre vorhandenen Abfragemethoden durch DAOs zu ersetzen.

Datenbankklasse erstellen

Bei Implementierungen von Room wird eine Datenbankklasse zum Verwalten einer Instanz der Datenbank verwendet. Die Datenbankklasse sollte RoomDatabase erweitern und auf alle Entitäten und DAOs verweisen, die Sie definiert haben.

Kotlin

@Database(entities = [User::class], version = 2)
@TypeConverters(DateConverter::class)
abstract class UsersDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Java

@Database(entities = {User.class}, version = 2)
@TypeConverters(DateConverter.class)
public abstract class UsersDatabase extends RoomDatabase {
  public abstract UserDao userDao();
}

Migrationspfad definieren

Da sich die Versionsnummer der Datenbank ändert, müssen Sie ein Migration-Objekt definieren, um einen Migrationspfad anzugeben, damit Room die vorhandenen Daten in der Datenbank behält. Solange sich das Datenbankschema nicht ändert, kann die Implementierung leer sein.

Kotlin

val MIGRATION_1_2 = object : Migration(1, 2) {
  override fun migrate(database: SupportSQLiteDatabase) {
    // Empty implementation, because the schema isn't changing.
  }
}

Java

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
  @Override
  public void migrate(SupportSQLiteDatabase database) {
    // Empty implementation, because the schema isn't changing.
  }
};

Weitere Informationen zu Datenbankmigrationspfaden in Room finden Sie unter Datenbank migrieren.

Datenbankinstanziierung aktualisieren

Nachdem Sie eine Datenbankklasse und einen Migrationspfad definiert haben, können Sie mit Room.databaseBuilder eine Instanz der Datenbank mit dem angewendeten Migrationspfad erstellen:

Kotlin

val db = Room.databaseBuilder(
          applicationContext,
          AppDatabase::class.java, "database-name"
        )
          .addMigrations(MIGRATION_1_2).build()

Java

db = Room.databaseBuilder(
          context.getApplicationContext(),
          UsersDatabase.class, "database-name"
        )
          .addMigrations(MIGRATION_1_2).build();

Implementierung testen

Testen Sie die neue Raumimplementierung:

  • Folgen Sie der Anleitung unter Migrationen testen, um Ihre Datenbankmigration zu testen.
  • Folgen Sie der Anleitung unter Datenbank testen, um Ihre DAO-Methoden zu testen.

Inkrementelle Migration

Wenn Ihre Anwendung eine große, komplexe Datenbank verwendet, ist es möglicherweise nicht möglich, die Anwendung auf einmal zu Room zu migrieren. Stattdessen können Sie optional die Datenentitäten und die Room-Datenbank als ersten Schritt implementieren und dann Ihre Abfragemethoden später zu DAOs migrieren. Dazu ersetzen Sie Ihre benutzerdefinierte Datenbankhilfsklasse durch das Objekt SupportSQLiteOpenHelper, das Sie von RoomDatabase.getOpenHelper() erhalten.

Weitere Informationen

Weitere Informationen zur Migration von SQLite zu Room finden Sie in den folgenden zusätzlichen Ressourcen:

Blogs