Cómo definir y consultar relaciones de uno a uno

En las relaciones de uno a uno entre dos entidades, cada instancia de la entidad principal corresponde a una sola instancia de la entidad secundaria y viceversa.

Por ejemplo, imagina una app de transmisión de música en la que el usuario tiene una biblioteca de canciones de su propiedad. Cada usuario tiene una sola biblioteca y cada biblioteca corresponde exactamente a un usuario. Por lo tanto, existe una relación de uno a uno entre la entidad User y la entidad Library.

Sigue estos pasos para definir y consultar relaciones uno a uno en tu base de datos:

  1. Define la relación: Crea clases para ambas entidades y asegúrate de que una haga referencia a la clave primaria de la otra.
  2. Consulta las entidades: Modela la relación en una nueva clase de datos y crea un método para recuperar los datos relacionados.

Define la relación

Para definir una relación de uno a uno, primero crea una clase para cada una de las dos entidades. Una de las entidades debe incluir una variable que haga referencia a la clave primaria de la otra entidad.

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

Consulta las entidades

Para consultar la lista de usuarios y las bibliotecas correspondientes, primero debes modelar la relación de uno a uno entre las dos entidades.

Para ello, crea una clase de datos nueva en la que cada instancia tenga una instancia de la entidad superior y la instancia correspondiente de la entidad secundaria. Agrega la anotación @Relation a la instancia de la entidad secundaria, y asigna a parentColumn el nombre de la columna de clave primaria de la entidad superior y a entityColumn el nombre de la columna de la entidad secundaria que hace referencia a la clave primaria de la entidad superior.

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 último, agrega un método a la clase DAO que devuelve todas las instancias de la clase de datos que vincula la entidad principal con la secundaria. Este método requiere que Room ejecute dos búsquedas. Por lo tanto, debes agregar la anotación @Transaction a este método. Esto garantiza que toda la operación se ejecute atómicamente.

Kotlin

@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();