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:
- Versehen Sie die Klassendeklaration mit
@Entity
, um anzugeben, dass es sich um eine Raumentität handelt. Mit dem AttributtableName
können Sie optional angeben, dass der Name der resultierenden Tabelle sich vom Klassennamen unterscheiden soll. - Annotieren Sie das Primärschlüsselfeld mit
@PrimaryKey
. - 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 Attributname
auf den richtigen Spaltennamen fest. - 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. - 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: