Definir e consultar relações "um para um"

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:

  1. Definir a relação: crie classes para as duas entidades, garantindo que uma referencia a chave primária da outra.
  2. 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();