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:
- Klassendeklaration annotieren mit
@Entity
, um anzugeben, dass es sich um einen Raumentität. Optional können Sie die Methode PropertytableName
in dass die resultierende Tabelle einen anderen Namen den Kursnamen. - Kennzeichnen Sie das Primärschlüsselfeld mit
@PrimaryKey
- Wenn eine der Spalten in der resultierenden Tabelle einen Namen haben sollte, der
nicht mit dem Namen des entsprechenden Feldes unterscheidet,
@ColumnInfo
und legen Siename
-Property mit dem richtigen Spaltennamen. - 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. - 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:
- Folgen Sie der Anleitung unter Testen Migrationen zum Testen Ihrer Datenbankmigration.
- Folgen Sie der Anleitung unter Testen der Datenbank, um Ihren DAO zu testen .
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: