Определение и запрос отношений «один к одному»

Отношение «один к одному» между двумя объектами — это отношения, в которых каждый экземпляр родительского объекта соответствует ровно одному экземпляру дочернего объекта, и обратное также верно.

Например, рассмотрим приложение потоковой передачи музыки, в котором у пользователя есть собственная библиотека песен. У каждого пользователя есть только одна библиотека, и каждая библиотека соответствует ровно одному пользователю. Следовательно, между сущностью « User и сущностью Library существует связь «один к одному».

Выполните следующие шаги, чтобы определить и запросить отношения «один к одному» в вашей базе данных:

  1. Определите связь : создайте классы для обеих сущностей, гарантируя, что одна ссылается на первичный ключ другой.
  2. Запросите сущности : смоделируйте отношения в новом классе данных и создайте метод для получения связанных данных.

Определите отношения

Чтобы определить связь «один к одному», сначала создайте класс для каждой из двух сущностей. Одна из сущностей должна включать переменную, которая является ссылкой на первичный ключ другой сущности.

Котлин

@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();