Definiowanie relacji jeden do jednego i wysyłanie zapytań dotyczących takich relacji
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
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 danych, 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;
}
Utwórz zapytanie dotyczące encji
Aby wysłać zapytanie 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();
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-07-27 UTC.
[[["Łatwo zrozumieć","easyToUnderstand","thumb-up"],["Rozwiązało to mój problem","solvedMyProblem","thumb-up"],["Inne","otherUp","thumb-up"]],[["Brak potrzebnych mi informacji","missingTheInformationINeed","thumb-down"],["Zbyt skomplikowane / zbyt wiele czynności do wykonania","tooComplicatedTooManySteps","thumb-down"],["Nieaktualne treści","outOfDate","thumb-down"],["Problem z tłumaczeniem","translationIssue","thumb-down"],["Problem z przykładami/kodem","samplesCodeIssue","thumb-down"],["Inne","otherDown","thumb-down"]],["Ostatnia aktualizacja: 2025-07-27 UTC."],[],[],null,["# Define and query one-to-one relationships\n\nA *one-to-one relationship* between two entities is a relationship where each\ninstance of the parent entity corresponds to exactly one instance of the child\nentity, and the reverse is also true.\n\nFor example, consider a music streaming app where the user has a library of\nsongs that they own. Each user has only one library, and each library\ncorresponds to exactly one user. Therefore, there is a one-to-one relationship\nbetween the `User` entity and the `Library` entity.\n\nFollow these steps to define and query one-to-one relationships in your\ndatabase:\n\n1. **[Define the relationship](#define)**: Create classes for both entities, ensuring one references the other's primary key.\n2. **[Query the entities](#query)**: Model the relationship in a new data class and create a method to retrieve the related data.\n\nDefine the relationship\n-----------------------\n\nTo define a one-to-one relationship, first create a class for each of your two\nentities. One of the entities must include a variable that is a reference to the\nprimary key of the other entity. \n\n### Kotlin\n\n @Entity\n data class User(\n @PrimaryKey val userId: Long,\n val name: String,\n val age: Int\n )\n\n @Entity\n data class Library(\n @PrimaryKey val libraryId: Long,\n val userOwnerId: Long\n )\n\n### Java\n\n @Entity\n public class User {\n @PrimaryKey public long userId;\n public String name;\n public int age;\n }\n\n @Entity\n public class Library {\n @PrimaryKey public long libraryId;\n public long userOwnerId;\n }\n\nQuery the entities\n------------------\n\nTo query the list of users and corresponding libraries, you must first model the\none-to-one relationship between the two entities.\n\nTo do this, create a new data class where each instance holds an instance of the\nparent entity and the corresponding instance of the child entity. Add the\n[`@Relation`](/reference/kotlin/androidx/room/Relation) annotation to the instance of the child entity, with\n[`parentColumn`](/reference/kotlin/androidx/room/Relation#parentcolumn()) set to the name of the primary key column of the parent\nentity and [`entityColumn`](/reference/kotlin/androidx/room/Relation#entitycolumn()) set to the name of the column of the child entity\nthat references the parent entity's primary key. \n\n### Kotlin\n\n data class UserAndLibrary(\n @Embedded val user: User,\n @Relation(\n parentColumn = \"userId\",\n entityColumn = \"userOwnerId\"\n )\n val library: Library\n )\n\n### Java\n\n public class UserAndLibrary {\n @Embedded public User user;\n @Relation(\n parentColumn = \"userId\",\n entityColumn = \"userOwnerId\"\n )\n public Library library;\n }\n\nFinally, add a method to the DAO class that returns all instances of the data\nclass that pairs the parent entity and the child entity. This method requires\nRoom to run two queries. You should therefore add the [`@Transaction`](/reference/kotlin/androidx/room/Transaction)\nannotation to this method. This ensures that the whole operation runs\natomically. \n\n### Kotlin\n\n @Transaction\n @Query(\"SELECT * FROM User\")\n fun getUsersAndLibraries(): List\u003cUserAndLibrary\u003e\n\n### Java\n\n @Transaction\n @Query(\"SELECT * FROM User\")\n public List\u003cUserAndLibrary\u003e getUsersAndLibraries();"]]