Definiowanie relacji jeden-do-wielu i wysyłanie zapytań do nich

Relacja jeden do wielu między 2 encjami to relacja, w której każda instancja encji nadrzędnej odpowiada 0 lub większej liczbie instancji encji podrzędnej, ale każda instancja encji podrzędnej może odpowiadać tylko jednej instancji encji nadrzędnej.

W przykładzie aplikacji do odtwarzania strumieniowego muzyki załóżmy, że użytkownik może organizować utwory w playlisty. Każdy użytkownik może utworzyć dowolną liczbę playlist, ale każda z nich jest tworzona przez dokładnie jednego użytkownika. Dlatego między elementem User a elementem Playlist występuje relacja jeden do wielu.

Aby zdefiniować relacje jeden-do-wielu w bazie danych i wysyłać do niej zapytania, wykonaj te czynności:

  1. Zdefiniuj relację: utwórz klasy dla obu encji, przy czym encja podrzędna odwołuje się do klucza podstawowego encji nadrzędnej.
  2. Wysyłanie zapytań do encji: modeluj relację w nowej klasie danych i wdrażaj metodę pobierania powiązanych danych.

Określanie relacji

Aby zdefiniować relację jeden do wielu, najpierw utwórz klasę dla dwóch encji. Podobnie jak w przypadku relacji jeden do jednego encja podrzędna musi zawierać zmienną, która jest odwołaniem do klucza podstawowego encji nadrzędnej.

Kotlin

@Entity
data class User(
    @PrimaryKey val userId: Long,
    val name: String,
    val age: Int
)

@Entity
data class Playlist(
    @PrimaryKey val playlistId: Long,
    val userCreatorId: Long,
    val playlistName: String
)

Java

@Entity
public class User {
    @PrimaryKey public long userId;
    public String name;
    public int age;
}

@Entity
public class Playlist {
    @PrimaryKey public long playlistId;
    public long userCreatorId;
    public String playlistName;
}

Wysyłanie zapytań o encje

Aby wysłać zapytanie dotyczące listy użytkowników i odpowiednich playlist, musisz najpierw modelować relację jeden do wielu między tymi dwoma elementami.

Aby to zrobić, utwórz nową klasę danych, w której każda instancja zawiera instancję jednostki nadrzędnej i listę wszystkich odpowiednich instancji jednostek podrzędnych. 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 UserWithPlaylists(
    @Embedded val user: User,
    @Relation(
          parentColumn = "userId",
          entityColumn = "userCreatorId"
    )
    val playlists: List<Playlist>
)

Java

public class UserWithPlaylists {
    @Embedded public User user;
    @Relation(
         parentColumn = "userId",
         entityColumn = "userCreatorId"
    )
    public List<Playlist> playlists;
}

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 Room, więc dodaj do niej adnotację @Transaction, aby cała operacja była wykonywana niepodzielnie.

Kotlin

@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();