Definiowanie danych za pomocą elementów dotyczących sal

Gdy korzystasz z biblioteki trwałości sal do do przechowywania danych aplikacji, definiowanie jednostek, które będą reprezentować obiekty, które chcesz przechowywać. Każda encja odpowiada tabeli w powiązanym pokoju i każde wystąpienie encji reprezentuje wiersz danych w odpowiadającej jej tabeli.

Oznacza to, że za pomocą elementów pokoju możesz zdefiniować bazę danych schemat bez dowolnego kodu SQL.

Anatomia jednostki

Każdą encję określa się jako klasę z adnotacjami @Entity Element „Pokój” zawiera pola dla każdej kolumny w odpowiedniej tabeli w bazie danych, w tym jedno pole lub więcej kolumn, które składają się na klucz podstawowy.

Ten kod to przykład prostej encji definiującej tabelę User z kolumnami ID, first name i last name:

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

Domyślnie Sala używa nazwy klasy jako nazwy tabeli bazy danych. Jeśli chcesz, aby atrybut ustaw inną nazwę tabeli, tableName właściwości @Entity adnotacja. Również nazwa pokoju używa nazw pól jako nazw kolumn w z bazą danych. Jeśli chcesz, by kolumna miała inną nazwę, dodaj atrybut @ColumnInfo do i ustaw name usłudze. Ten przykład pokazuje niestandardowe nazwy tabeli i jej kolumn:

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

Zdefiniuj klucz podstawowy

Każda encja dotycząca pokoju musi mieć zdefiniowany klucz podstawowy jednoznacznie identyfikują każdy wiersz w odpowiedniej tabeli bazy danych. Najbardziej prosty sposób to dodanie adnotacji do pojedynczej kolumny @PrimaryKey:

Kotlin

@PrimaryKey val id: Int

Java

@PrimaryKey
public int id;

Zdefiniuj złożony klucz podstawowy

Jeśli wystąpienia elementu mają być jednoznacznie identyfikowane za pomocą kombinacji w przypadku wielu kolumn, możesz zdefiniować złożony klucz podstawowy, podając je w primaryKeys właściwość @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;
}

Ignoruj pola

Domyślnie Sala tworzy kolumnę dla każdego pola zdefiniowanego w elemencie. Jeśli encja zawiera pola, których nie chcesz zachowywać, możesz dodać do nich adnotacje przy użyciu @Ignore, jako w tym fragmencie kodu:

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

Gdy jednostka dziedziczy pola z elementu nadrzędnego, zazwyczaj łatwiej jest korzystać ignoredColumns właściwość atrybut @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;
}

Pokoje obsługują kilka typów adnotacji, które ułatwiają wyszukiwanie . Używaj wyszukiwania pełnotekstowego, chyba że minSdkVersion ma wartość mniejszą niż 16.

Obsługa wyszukiwania pełnotekstowego

Jeśli Twoja aplikacja wymaga bardzo szybkiego dostępu do informacji z bazy danych w trybie pełnotekstowym wyszukiwarka (FTS), umieść encje w oparciu o tabelę wirtualną, która używa rozszerzenie SQLite FTS3 lub FTS4 . Aby użyć tej funkcji, dostępnej w Pokoju w wersji 2.1.0 lub nowszej, dodaj parametr @Fts3 lub @Fts4 adnotacja do danego elementu, na przykład w tym fragmencie kodu:

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

Jeśli w tabeli znajdują się treści w wielu językach, użyj funkcji Opcja languageId określająca kolumnę, która przechowuje informacje o języku każdy wiersz:

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

Room udostępnia kilka innych opcji definiowania elementów obsługiwanych przez FTS, w tym: kolejność wyników, typy tokenizacji i tabele zarządzane jako treść zewnętrzna. Dla: więcej informacji na temat tych opcji znajdziesz w FtsOptions.

Indeksuj kolumny z konkretnymi

Jeśli Twoja aplikacja musi obsługiwać wersje pakietu SDK, które nie obsługują FTS3- lub jednostek opartych na tabeli FTS4, nadal możesz indeksować niektóre kolumny w bazie danych aby przyspieszyć zapytania. Aby dodać indeksy do elementu, umieść w nim indeksy indices w usłudze @Entity, podając nazwy kolumn, które chcesz uwzględnić w indeksie lub indeksu złożonego. Ten fragment kodu ilustruje tę adnotację proces:

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

Czasami niektóre pola lub grupy pól w bazie danych muszą być niepowtarzalne. Możesz egzekwować tę właściwość wyjątkowości przez ustawienie atrybutu unique właściwość @Index adnotacja do true. Poniższy przykładowy kod zapobiega sytuacji, w której tabela ma dwa wiersze zawierające ten sam zbiór wartości w kolumnach firstName i Kolumny (lastName):

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

Uwzględnij obiekty oparte na wartości automatycznej

W pokoju 2.1.0 i nowszych możesz użyć stałej wartości w Javie zajęcia, które dodajesz za pomocą adnotacji @AutoValue jako elementów w bazie danych aplikacji. Ten wsparcie jest szczególnie przydatne, gdy brane są pod uwagę dwa przypadki elementu , jeśli ich kolumny zawierają identyczne wartości.

Podczas używania klas oznaczonych jako elementy @AutoValue możesz dodawać adnotacje abstrakcyjne metody klasy z użyciem @PrimaryKey, @ColumnInfo, @Embedded i @Relation. Jeśli jednak używasz tych adnotacji, musisz dodać atrybut @CopyAnnotations za każdym razem, aby sala mogła zinterpretować metodę automatycznie generowanych implementacji.

Poniższy fragment kodu zawiera przykład klasy z adnotacją @AutoValue, który sala rozpoznaje jako encję:

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