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