Отношение «один к одному» между двумя объектами — это отношения, в которых каждый экземпляр родительского объекта соответствует ровно одному экземпляру дочернего объекта, и обратное также верно.
Например, рассмотрим приложение потоковой передачи музыки, в котором у пользователя есть собственная библиотека песен. У каждого пользователя есть только одна библиотека, и каждая библиотека соответствует ровно одному пользователю. Следовательно, между сущностью « User
и сущностью Library
существует связь «один к одному».
Выполните следующие шаги, чтобы определить и запросить отношения «один к одному» в вашей базе данных:
- Определите связь : создайте классы для обеих сущностей, гарантируя, что одна ссылается на первичный ключ другой.
- Запросите сущности : смоделируйте отношения в новом классе данных и создайте метод для получения связанных данных.
Определите отношения
Чтобы определить связь «один к одному», сначала создайте класс для каждой из двух сущностей. Одна из сущностей должна включать переменную, которая является ссылкой на первичный ключ другой сущности.
Котлин
@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
)
Ява
@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;
}
Запросить сущности
Чтобы запросить список пользователей и соответствующих библиотек, необходимо сначала смоделировать взаимно однозначное отношение между двумя объектами.
Для этого создайте новый класс данных, каждый экземпляр которого содержит экземпляр родительской сущности и соответствующий экземпляр дочерней сущности. Добавьте аннотацию @Relation
к экземпляру дочерней сущности, при этом для parentColumn
будет задано имя столбца первичного ключа родительской сущности, а entityColumn
задано имя столбца дочерней сущности, который ссылается на первичный ключ родительской сущности.
Котлин
data class UserAndLibrary(
@Embedded val user: User,
@Relation(
parentColumn = "userId",
entityColumn = "userOwnerId"
)
val library: Library
)
Ява
public class UserAndLibrary {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userOwnerId"
)
public Library library;
}
Наконец, добавьте в класс DAO метод, который возвращает все экземпляры класса данных, объединяющего родительский объект и дочерний объект. Этот метод требует, чтобы Room выполнил два запроса. Поэтому вам следует добавить аннотацию @Transaction
к этому методу. Это гарантирует, что вся операция выполняется атомарно.
Котлин
@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>
Ява
@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();