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:
- Defina a relação: crie classes para as duas entidades, com a entidade filha fazendo referência à chave primária da entidade mãe.
- 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 de entidade filha correspondentes. Adicione a
anotação @Relation
à instância da entidade filha, com
parentColumn
definido como o nome da coluna de chave primária da entidade
mãe e entityColumn
definido 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();