Relacja jeden do jednego między dwoma podmiotami to relacja, w której każdy przypadek podmiotu nadrzędnego odpowiada dokładnie jednemu przypadkowi podmiotu podrzędnego i na odwrót.
Weźmy na przykład aplikację do strumieniowego odtwarzania muzyki, w której użytkownik ma własną bibliotekę utworów. Każdy użytkownik ma tylko jedną bibliotekę, a każda biblioteka odpowiada dokładnie 1 użytkownikowi. Dlatego istnieje relacja 1 do 1 między elementem User
a elementem Library
.
Aby zdefiniować relacje jeden-do-jednego w swojej bazie danych i wysyłać zapytania o nie, wykonaj te czynności:
- Zdefiniuj relację: utwórz klasy dla obu typów, upewniając się, że jedna z nich odwołuje się do klucza głównego drugiej.
- Wysyłanie zapytań do jednostek: modeluj relacje w nowej klasie danych i utwórz metodę służącą do pobierania powiązanych danych.
Definiowanie relacji
Aby zdefiniować relację jeden-do-jednego, najpierw utwórz klasę dla każdej z tych dwóch jednostek. Jeden z podmiotów musi zawierać zmienną, która jest odwołaniem do klucza głównego 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;
}
Tworzenie zapytań dotyczących encji
Aby zapytać o listę użytkowników i odpowiadających im bibliotek, musisz najpierw zamodelować relację jeden-do-jednego między tymi dwoma elementami.
Aby to zrobić, utwórz nową klasę danych, w której każde wystąpienie zawiera wystąpienie nadrzędnego elementu i odpowiednie wystąpienie elementu podrzędnego. 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 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 wystąpienia klasy danych, która łączy element nadrzędny z elementem podrzędnym. Ta metoda wymaga, aby Pokój wykonał 2 zapytania. Dlatego do tej metody musisz dodać adnotację @Transaction
. Dzięki temu cała operacja będzie wykonywana w sposób atomowy.
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();