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