Relacja jeden do jednego między dwoma encjami to relacja, w której każdy egzemplarz encji nadrzędnej odpowiada dokładnie jednemu egzemplarzowi encji podrzędnej i na odwrót.
Weźmy na przykład aplikację do odtwarzania strumieniowego muzyki, w której użytkownik ma bibliotekę utworów, które są jego własnością. Każdy użytkownik ma tylko jedną bibliotekę, a każda biblioteka jest przypisana do dokładnie jednego użytkownika. Dlatego między elementem User a elementem Library występuje relacja 1:1.
Aby zdefiniować relacje jeden do jednego w bazie danych i wysyłać do niej zapytania, wykonaj te czynności:
- Zdefiniuj relację: utwórz klasy dla obu typów danych, dbając o to, aby jedna z nich odwoływała się do klucza podstawowego drugiej.
- Wysyłanie zapytań do encji: modelowanie relacji w nowej klasie danych i tworzenie metody pobierania powiązanych danych.
Określanie relacji
Aby zdefiniować relację jeden do jednego, najpierw utwórz klasę dla każdej z 2 encji. Jeden z podmiotów musi zawierać zmienną, która jest odwołaniem do klucza podstawowego drugiego podmiotu.
Kotlin
@Entity
data class User(
@PrimaryKey val userId: Long,
val name: String,
val age: Int
)
@Entity
data class Library(
@PrimaryKey val libraryId: Long,
val userOwnerId: Long
)
Java
@Entity
public class User {
@PrimaryKey public long userId;
public String name;
public int age;
}
@Entity
public class Library {
@PrimaryKey public long libraryId;
public long userOwnerId;
}
Wysyłanie zapytań o encje
Aby wysłać zapytanie dotyczące listy użytkowników i odpowiadających im bibliotek, musisz najpierw utworzyć model relacji 1:1 między tymi 2 podmiotami.
Aby to zrobić, utwórz nową klasę danych, w której każde wystąpienie zawiera wystąpienie elementu nadrzędnego i odpowiednie wystąpienie elementu podrzędnego. Dodaj adnotację
@Relation do instancji podrzędnego typu jednostki, ustawiając parentColumn na nazwę kolumny klucza podstawowego nadrzędnego typu jednostki, a entityColumn na nazwę kolumny podrzędnego typu jednostki, która odwołuje się do klucza podstawowego nadrzędnego typu jednostki.
Kotlin
data class UserAndLibrary(
@Embedded val user: User,
@Relation(
parentColumn = "userId",
entityColumn = "userOwnerId"
)
val library: Library
)
Java
public class UserAndLibrary {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userOwnerId"
)
public Library library;
}
Na koniec dodaj do klasy DAO metodę, która zwraca wszystkie instancje klasy danych, które łączą element nadrzędny z elementem podrzędnym. Ta metoda wymaga wykonania 2 zapytań przez bibliotekę Room. Dlatego do tej metody należy dodać adnotację @Transaction. Dzięki temu cała operacja jest wykonywana niepodzielnie.
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();