Definir e consultar relações de um para muitos

Uma relação de um para muitos entre duas entidades é uma relação em que cada instância da entidade pai corresponde a zero ou mais instâncias da entidade filha, mas cada instância da entidade filha só pode corresponder exatamente a uma instância da entidade pai.

No exemplo do app de streaming de música, suponha que o usuário consiga organizar as músicas em playlists. Cada usuário pode criar quantas playlists quiser, mas cada playlist é criada por exatamente um usuário. Portanto, há uma relação de um para muitos entre a entidade User e a entidade Playlist.

Siga estas etapas para definir e consultar relações "um para muitos" no seu banco de dados:

  1. Defina a relação: crie classes para as duas entidades, com a entidade filha fazendo referência à chave primária da entidade mãe.
  2. Consultar as entidades: modele a relação em uma nova classe de dados e implemente um método para recuperar os dados relacionados.

Definir a relação

Para definir uma relação de um para muitos, crie uma classe para as duas entidades. Como nas relações um para um, a entidade filha precisa incluir uma variável que seja uma referência à chave primária da entidade pai.

Kotlin

@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;
}

Consultar as entidades

Para consultar a lista de usuários e playlists correspondentes, é necessário modelar a relação um para muitos entre as duas entidades.

Para fazer isso, crie uma nova classe de dados em que cada instância contenha uma instância da entidade pai e uma lista de todas as instâncias da entidade filha correspondente. Adicione a anotação @Relation à instância da entidade filha, com parentColumn definida como o nome da coluna de chave primária da entidade mãe e entityColumn definida como o nome da coluna da entidade filha que faz referência à chave primária da entidade mãe.

Kotlin

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;
}

Por fim, adicione um método à classe DAO que retorna todas as instâncias da classe de dados com as entidades pai e filha pareadas. Esse método exige que o Room execute duas consultas. Portanto, adicione a anotação @Transaction a esse método para garantir que toda a operação seja realizada atomicamente.

Kotlin

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

Java

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