Daten mithilfe von Zimmerentitäten definieren

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;
}

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:

User.java

@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);
    }
}