Definiowanie relacji jeden do jednego i wysyłanie zapytań dotyczących takich relacji

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:

  1. Zdefiniuj relację: utwórz klasy dla obu typów, upewniając się, że jedna z nich odwołuje się do klucza głównego drugiej.
  2. 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();