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

Relacja jeden-do-wielu między 2 elementami to relacja, w której każdy element nadrzędny odpowiada 0 lub więcej elementom podrzędnym, ale każdy element podrzędny może odpowiadać tylko jednemu elementowi nadrzędnemu.

W przypadku aplikacji do strumieniowego przesyłania muzyki załóżmy, że użytkownik może porządkować utwory na playlistach. Każdy użytkownik może utworzyć dowolną liczbę playlist, ale każda playlista może być utworzona przez dokładnie 1 użytkownika. Dlatego między elementem User a elementem Playlist istnieje relacja „jeden do wielu”.

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

  1. Zdefiniuj relację: utwórz klasy dla obu typów encji, przy czym typ podrzędny ma odwoływać się do klucza podstawowego typu nadrzędnego.
  2. Wysyłanie zapytań do jednostek: modeluj relacje w nowej klasie danych i wdróż metodę służącą do pobierania powiązanych danych.

Definiowanie relacji

Aby zdefiniować relację jeden-do-wielu, najpierw utwórz klasę dla tych 2 elementów. 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;
}

Utwórz zapytanie dotyczące encji

Aby zapytać o listę użytkowników i odpowiadające im playlisty, musisz najpierw zmodelować 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ę nadrzędnej encji i listę wszystkich odpowiadających jej podrzędnych encji. Dodaj adnotację @Relation do wystąpienia podrzędnej encji, przy czym parametr parentColumn ma wartość nazwy kolumny klucza podstawowego encji nadrzędnej, a parametr entityColumn ma wartość nazwy kolumny encji podrzędnej, która odwołuje się do klucza podstawowego encji nadrzędnej.

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 wystąpienia klasy danych, która łączy element nadrzędny z elementem podrzędnym. Ta metoda wymaga, aby Room wykonał 2 zapytania, więc dodaj do niej adnotację @Transaction, aby cała operacja została wykonana w ramach jednej operacji atomowej.

Kotlin

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

Java

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