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:
- Zdefiniuj relację: utwórz klasy dla obu encji, przy czym encja podrzędna odwołuje się do klucza podstawowego encji nadrzędnej.
- 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();