Von SQLite zu Room migrieren

Die Room-Persistenzbibliothek bietet eine Reihe von Vorteilen gegenüber der SQLite-Bibliothek. APIs direkt verwenden:

  • Überprüfung der Kompilierungszeit von SQL-Abfragen
  • Praktische Anmerkungen, mit denen sich wiederholende und fehleranfällige Textbausteine minimiert werden Code
  • Optimierte Pfade für die Datenbankmigration

Wenn deine App derzeit eine Nicht-Room-Implementierung von SQLite verwendet, lies diese Seite . Wenn der Raum der erste ist SQLite-Implementierung, die Sie in Ihrer App verwenden, siehe Daten lokal speichern mithilfe von Room grundlegende Informationen zur Nutzung abrufen.

Migrationsschritte

Führen Sie die folgenden Schritte aus, um Ihre SQLite-Implementierung zu Room zu migrieren. Wenn SQLite-Implementierung eine große Datenbank oder komplexe Abfragen nutzt, schrittweise zu Room migrieren. Siehe Inkrementelle Migration für eine inkrementelle Migrationsstrategie.

Abhängigkeiten aktualisieren

Wenn Sie Room in Ihrer App verwenden möchten, müssen Sie die entsprechenden Abhängigkeiten in die App-Datei build.gradle. Weitere Informationen finden Sie unter Einrichtung für aktuelle Raumabhängigkeiten.

Modellklassen auf Datenentitäten aktualisieren

In Chatrooms werden Datenentitäten verwendet, um die Tabellen in der Datenbank darstellen. Jede Entitätsklasse stellt eine Tabelle und enthält Felder, die Spalten in dieser Tabelle darstellen. So aktualisieren Sie zu Raumentitäten hinzu:

  1. Klassendeklaration annotieren mit @Entity, um anzugeben, dass es sich um einen Raumentität. Optional können Sie die Methode Property tableName in dass die resultierende Tabelle einen anderen Namen den Kursnamen.
  2. Kennzeichnen Sie das Primärschlüsselfeld mit @PrimaryKey
  3. Wenn eine der Spalten in der resultierenden Tabelle einen Namen haben sollte, der nicht mit dem Namen des entsprechenden Feldes unterscheidet, @ColumnInfo und legen Sie name-Property mit dem richtigen Spaltennamen.
  4. Wenn die Klasse Felder enthält, die Sie nicht in der Datenbank beibehalten möchten, diese Felder mit @Ignore, um anzugeben, dass der Raum keine Spalten in der entsprechenden Tabelle erstellen.
  5. Wenn die Klasse über mehr als eine Konstruktormethode verfügt, geben Sie an, welcher Konstruktor Room sollte verwendet werden, indem alle anderen Konstruktoren mit @Ignore annotiert werden.

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 Datenzugriffsobjekte (DAOs), um Methoden für den Zugriff auf die Datenbank zu definieren. Folgen Sie der Anleitung unter Über den Chatroom auf Daten zugreifen. DAOs, um Ihre vorhandene Abfrage zu ersetzen mit DAOs arbeiten können.

Datenbankklasse erstellen

Bei Implementierungen von Room wird eine Datenbankklasse verwendet, um eine Instanz des Datenbank. Ihre Datenbankklasse sollte RoomDatabase und verweisen auf alle der von Ihnen definierten Entitäten und DAOs.

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 eine Objekt Migration für einen Migrationspfad angeben, damit Room die vorhandenen Daten in der Datenbank behält. Solange sich das Datenbankschema nicht ändert, kann dieses Feld leer sein Implementierung.

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 Migration der Datenbank.

Datenbankinstanziierung aktualisieren

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

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 Implementierung für den Chatroom:

Inkrementelle Migration

Wenn Ihre Anwendung eine große, komplexe Datenbank verwendet, ist eine Migration möglicherweise nicht möglich alle Apps gleichzeitig in Chatroom verschieben. Stattdessen können Sie die Daten optional Entitäten und die Raumdatenbank an. Anschließend migrieren Sie Ihre Abfragemethoden. später in DAOs einsteigen. Ersetzen Sie dazu Ihren benutzerdefinierten Datenbankhelfer Klasse durch die SupportSQLiteOpenHelper ein Objekt, das Sie von RoomDatabase.getOpenHelper()

Weitere Informationen

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

Blogs