Em um relação de um para um entre duas entidades, cada instância da entidade pai corresponde exatamente a uma instância da entidade filha. O inverso também é verdadeiro.
Por exemplo, considere um app de streaming de música em que o usuário tem uma biblioteca de músicas
que pertencem a ele. Cada usuário tem apenas uma biblioteca, e cada biblioteca
corresponde exatamente a um usuário. Portanto, há uma relação direta
entre a entidade User
e a entidade Library
.
Siga estas etapas para definir e consultar relações um-para-um no seu banco de dados:
- Definir a relação: crie classes para as duas entidades, garantindo que uma referencia a chave primária da outra.
- Consultar as entidades: modele a relação em uma nova classe de dados e crie um método para recuperar os dados relacionados.
Definir a relação
Para definir uma relação de um para um, crie uma classe para cada entidade. Uma das entidades precisa incluir uma variável que seja uma referência à chave primária da outra entidade.
Kotlin
@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
)
Java
@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;
}
Consultar as entidades
Para consultar a lista de usuários e bibliotecas correspondentes, primeiro você precisa modelar a relação de um para um 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 a instância correspondente da entidade filha. 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 UserAndLibrary(
@Embedded val user: User,
@Relation(
parentColumn = "userId",
entityColumn = "userOwnerId"
)
val library: Library
)
Java
public class UserAndLibrary {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userOwnerId"
)
public Library library;
}
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. Isso garante que toda a operação seja executada
de forma atômica.
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();