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

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

В примере с приложением для потоковой передачи музыки предположим, что пользователь может организовывать свои песни в плейлисты. Каждый пользователь может создать столько плейлистов, сколько захочет, но каждый плейлист создаст ровно один пользователь. Следовательно, существует отношение «один ко многим» между сущностью User и сущностью Playlist .

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

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

Определите взаимоотношения

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

Котлин

@Entity
data class User(
    @PrimaryKey val userId: Long,
    val name: String,
    val age: Int
)

@Entity
data class Playlist(
    @PrimaryKey val playlistId: Long,
    val userCreatorId: Long,
    val playlistName: String
)

Java

@Entity
public class User {
    @PrimaryKey public long userId;
    public String name;
    public int age;
}

@Entity
public class Playlist {
    @PrimaryKey public long playlistId;
    public long userCreatorId;
    public String playlistName;
}

Запрос к сущностям

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

Для этого создайте новый класс данных, в каждом экземпляре которого будет храниться экземпляр родительской сущности и список всех соответствующих экземпляров дочерних сущностей. Добавьте аннотацию @Relation к экземпляру дочерней сущности, установив parentColumn равным имени столбца первичного ключа родительской сущности, а entityColumn — имени столбца дочерней сущности, который ссылается на первичный ключ родительской сущности.

Котлин

data class UserWithPlaylists(
    @Embedded val user: User,
    @Relation(
          parentColumn = "userId",
          entityColumn = "userCreatorId"
    )
    val playlists: List<Playlist>
)

Java

public class UserWithPlaylists {
    @Embedded public User user;
    @Relation(
         parentColumn = "userId",
         entityColumn = "userCreatorId"
    )
    public List<Playlist> playlists;
}

Наконец, добавьте в класс DAO метод, который возвращает все экземпляры класса данных, связывающего родительскую и дочернюю сущности. Для работы этого метода Room должен выполнить два запроса, поэтому добавьте к нему аннотацию @Transaction , чтобы вся операция выполнялась атомарно.

Котлин

@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();