Definiowanie relacji jeden do jednego i wysyłanie zapytań dotyczących takich relacji

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:

  1. 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.
  2. 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();