Wenn Sie die Chat-Persistenzbibliothek verwenden, um App-Daten speichern können, definieren Sie Entitäten zur Darstellung der Objekte, die Sie speichern möchten. Jede Entität entspricht einer Tabelle im zugehörigen Raum und jede Instanz einer Entität stellt eine Datenzeile im entsprechende Tabelle.
Das bedeutet, dass Sie mit Raumentitäten Ihre Datenbank definieren können. Schema ohne wenn ich SQL-Code schreibe.
Anatomie einer Entität
Sie definieren jede Raumentität als Klasse annotiert mit
@Entity
Eine Raumentität umfasst Folgendes:
-Felder für jede Spalte in der entsprechenden Tabelle in der Datenbank, einschließlich eines
oder mehr Spalten, aus denen der Primärschlüssel besteht.
Der folgende Code ist ein Beispiel für eine einfache Entität, mit der eine User
-Tabelle definiert wird
mit Spalten für ID, Vorname und Nachname:
Kotlin
@Entity data class User( @PrimaryKey val id: Int, val firstName: String?, val lastName: String? )
Java
@Entity public class User { @PrimaryKey public int id; public String firstName; public String lastName; }
Standardmäßig verwendet Room den Klassennamen als Namen der Datenbanktabelle. Wenn Sie möchten, dass die
um einen anderen Namen zu erhalten,
tableName
-Eigenschaft des
@Entity
-Anmerkung. In gleicher Weise verwendet Room die Feldnamen als Spaltennamen in
in der Datenbank. Soll eine Spalte einen anderen Namen haben, fügen Sie den Parameter
@ColumnInfo
-Anmerkung in der
und legen Sie name
fest.
Property. Im folgenden Beispiel sehen Sie benutzerdefinierte Namen für eine Tabelle und ihre Spalten:
Kotlin
@Entity(tableName = "users") data class User ( @PrimaryKey val id: Int, @ColumnInfo(name = "first_name") val firstName: String?, @ColumnInfo(name = "last_name") val lastName: String? )
Java
@Entity(tableName = "users") public class User { @PrimaryKey public int id; @ColumnInfo(name = "first_name") public String firstName; @ColumnInfo(name = "last_name") public String lastName; }
Primärschlüssel definieren
Jede Raumentität muss einen Primärschlüssel definieren
der jede Zeile in der entsprechenden Datenbanktabelle eindeutig identifiziert. Die meisten
Die einfachste Möglichkeit dazu ist, eine einzelne Spalte mit
@PrimaryKey
:
Kotlin
@PrimaryKey val id: Int
Java
@PrimaryKey public int id;
Zusammengesetzten Primärschlüssel definieren
Wenn Instanzen einer Entität eindeutig durch eine Kombination aus
Spalten haben, können Sie einen zusammengesetzten Primärschlüssel definieren, indem Sie
Spalten in der Spalte
primaryKeys
-Property von
@Entity
:
Kotlin
@Entity(primaryKeys = ["firstName", "lastName"]) data class User( val firstName: String?, val lastName: String? )
Java
@Entity(primaryKeys = {"firstName", "lastName"}) public class User { public String firstName; public String lastName; }
Felder ignorieren
Standardmäßig erstellt „Raum“ eine Spalte für jedes Feld, das in der Entität definiert ist.
Wenn eine Entität Felder enthält, die nicht beibehalten werden sollen, können Sie diese mit Anmerkungen versehen
mit @Ignore
, wie
wie im folgenden Code-Snippet dargestellt:
Kotlin
@Entity data class User( @PrimaryKey val id: Int, val firstName: String?, val lastName: String?, @Ignore val picture: Bitmap? )
Java
@Entity public class User { @PrimaryKey public int id; public String firstName; public String lastName; @Ignore Bitmap picture; }
In Fällen, in denen eine Entität Felder von einer übergeordneten Entität übernimmt, ist es normalerweise
einfacher zu verwenden ist,
Property ignoredColumns
von
Attribut @Entity
:
Kotlin
open class User { var picture: Bitmap? = null } @Entity(ignoredColumns = ["picture"]) data class RemoteUser( @PrimaryKey val id: Int, val hasVpn: Boolean ) : User()
Java
@Entity(ignoredColumns = "picture") public class RemoteUser extends User { @PrimaryKey public int id; public boolean hasVpn; }
Unterstützung für die Tabellensuche bereitstellen
Der Chatroom unterstützt verschiedene Arten von Anmerkungen, die dir die Suche erleichtern
nach Details in den Tabellen Ihrer Datenbank. Volltextsuche verwenden, es sei denn,
minSdkVersion
ist kleiner als 16.
Volltextsuche unterstützen
Wenn Ihre App einen sehr schnellen Zugriff auf Datenbankinformationen über Volltext erfordert
suchen, lassen Sie Ihre Entitäten durch eine virtuelle Tabelle gestützt werden, die entweder
die SQLite-Erweiterung FTS3 oder FTS4
Modul Um diese Funktion zu nutzen,
die in Raum 2.1.0 und höher verfügbar sind, fügen Sie
@Fts3
oder
@Fts4
-Annotation zu einer bestimmten Entität hinzufügen, wie hier gezeigt
im folgenden Code-Snippet einfügen:
Kotlin
// Use `@Fts3` only if your app has strict disk space requirements or if you // require compatibility with an older SQLite version. @Fts4 @Entity(tableName = "users") data class User( /* Specifying a primary key for an FTS-table-backed entity is optional, but if you include one, it must use this type and column name. */ @PrimaryKey @ColumnInfo(name = "rowid") val id: Int, @ColumnInfo(name = "first_name") val firstName: String? )
Java
// Use `@Fts3` only if your app has strict disk space requirements or if you // require compatibility with an older SQLite version. @Fts4 @Entity(tableName = "users") public class User { // Specifying a primary key for an FTS-table-backed entity is optional, but // if you include one, it must use this type and column name. @PrimaryKey @ColumnInfo(name = "rowid") public int id; @ColumnInfo(name = "first_name") public String firstName; }
Wenn eine Tabelle Inhalte in mehreren Sprachen unterstützt, verwenden Sie die Methode
languageId
-Option, mit der die Spalte angegeben wird, in der Sprachinformationen gespeichert werden für
für jede Zeile:
Kotlin
@Fts4(languageId = "lid") @Entity(tableName = "users") data class User( // ... @ColumnInfo(name = "lid") val languageId: Int )
Java
@Fts4(languageId = "lid") @Entity(tableName = "users") public class User { // ... @ColumnInfo(name = "lid") int languageId; }
Der Chatroom bietet mehrere weitere Optionen zum Definieren von FTS-gestützten Entitäten, darunter:
Ergebnissortierung, Tokenizer-Typen und Tabellen, die als externer Inhalt verwaltet werden. Für
Weitere Informationen zu diesen Optionen finden Sie in der
Referenz zu FtsOptions
Indexspezifische Spalten
Wenn Ihre App SDK-Versionen unterstützen muss, die FTS3- oder
Durch FTS4-Tabellen gesicherte Entitäten können bestimmte Spalten in der Datenbank weiterhin indexiert werden.
um Abfragen zu beschleunigen. Fügen Sie zum Hinzufügen von Indizes zu einer Entität den
indices
im
@Entity
-Anmerkung,
die Namen der Spalten auflisten,
die Sie in den Index aufnehmen möchten, oder
zusammengesetzten Index an. Das folgende Code-Snippet zeigt diese Annotation
Prozess:
Kotlin
@Entity(indices = [Index(value = ["last_name", "address"])]) data class User( @PrimaryKey val id: Int, val firstName: String?, val address: String?, @ColumnInfo(name = "last_name") val lastName: String?, @Ignore val picture: Bitmap? )
Java
@Entity(indices = {@Index("name"), @Index(value = {"last_name", "address"})}) public class User { @PrimaryKey public int id; public String firstName; public String address; @ColumnInfo(name = "last_name") public String lastName; @Ignore Bitmap picture; }
Manchmal müssen bestimmte Felder oder Feldgruppen in einer Datenbank eindeutig sein.
Sie können diese Eindeutigkeitseigenschaft erzwingen, indem Sie die Methode
unique
Eigenschaft einer @Index
Anmerkung zu true
. Im folgenden Codebeispiel wird verhindert, dass in einer Tabelle
Zwei Zeilen, die die gleichen Werte für firstName
und
lastName
Spalten:
Kotlin
@Entity(indices = [Index(value = ["first_name", "last_name"], unique = true)]) data class User( @PrimaryKey val id: Int, @ColumnInfo(name = "first_name") val firstName: String?, @ColumnInfo(name = "last_name") val lastName: String?, @Ignore var picture: Bitmap? )
Java
@Entity(indices = {@Index(value = {"first_name", "last_name"}, unique = true)}) public class User { @PrimaryKey public int id; @ColumnInfo(name = "first_name") public String firstName; @ColumnInfo(name = "last_name") public String lastName; @Ignore Bitmap picture; }
Auf AutoValue basierende Objekte einschließen
In Raum 2.1.0 und höher können Sie Java-basierte unveränderliche Werte
Klassen,
die Sie mit @AutoValue
als Entitäten in der Datenbank Ihrer Anwendung annotieren. Dieses
-Unterstützung ist besonders hilfreich, wenn zwei Instanzen einer Entität
gleich sein, wenn ihre Spalten identische Werte enthalten.
Wenn Sie mit @AutoValue
annotierte Klassen als Entitäten verwenden, können Sie die
abstrakten Methoden der Klasse mit @PrimaryKey
, @ColumnInfo
, @Embedded
und
@Relation
Wenn Sie diese Annotationen verwenden, müssen Sie jedoch den Parameter
@CopyAnnotations
-Anmerkung jedes Mal, damit Room die Methoden interpretieren kann
automatisch generierten Implementierungen.
Das folgende Code-Snippet zeigt ein Beispiel für eine Klasse, die mit
@AutoValue
, die der Chatroom als Entität erkennt:
@AutoValue @Entity public abstract class User { // Supported annotations must include `@CopyAnnotations`. @CopyAnnotations @PrimaryKey public abstract long getId(); public abstract String getFirstName(); public abstract String getLastName(); // Room uses this factory method to create User objects. public static User create(long id, String firstName, String lastName) { return new AutoValue_User(id, firstName, lastName); } }