Creando relaciones entre tablas con Room y Kotlin: una guía paso a paso
Antonio Leiva

Las bases de datos son una herramienta fundamental en el desarrollo de aplicaciones móviles, ya que nos permiten almacenar y recuperar datos de manera rápida y eficiente.

Una de las ventajas de utilizar Room, el framework de persistencia de datos de Android, es su capacidad para crear relaciones entre tablas de manera sencilla y segura.

Para crear relaciones entre tablas en Room, primero debemos definir nuestras entidades de datos, que representan las tablas de nuestra base de datos.

Por ejemplo, si queremos almacenar información sobre usuarios y sus respectivas tareas, podríamos definir las siguientes entidades:

@Entity
data class User(
    @PrimaryKey val id: Int,
    val name: String
)

@Entity
data class Task(
    @PrimaryKey val id: Int,
    val title: String,
    val description: String,
    val userId: Int
)

En estas entidades, hemos utilizado la anotación @Entity para indicar que se trata de una entidad de datos, y hemos especificado una clave primaria mediante la anotación @PrimaryKey. Además, en la entidad Task hemos añadido un campo userId que nos permitirá establecer una relación con la entidad User.

Una vez que tenemos nuestras entidades definidas, debemos crear una interfaz que herede de la interfaz RoomDatabase y defina las operaciones que queremos realizar en nuestra base de datos. Esta interfaz también nos permitirá establecer las relaciones entre entidades mediante la anotación @Relation:

@Dao
interface UserDao {

    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE id = :id")
    fun getById(id: Int): User

    @Insert
    fun insert(user: User)
}

@Dao
interface TaskDao {

    @Query("SELECT * FROM task")
    fun getAll(): List<Task>

    @Query("SELECT * FROM task WHERE userId = :userId")
    fun getByUserId(userId: Int): List<Task>

    @Insert
    fun insert(task: Task)
}

@Database(entities = [User::class, Task::class], version = 1)
abstract class AppDatabase : RoomDatabase() {

    abstract fun userDao(): UserDao

    abstract fun taskDao(): TaskDao
}

En este código, hemos definido dos interfaces de acceso a datos (DAO) que contienen las consultas que queremos realizar en nuestras entidades.

Además, hemos creado una interfaz abstracta que hereda de RoomDatabase y nos permita exponer los métodos de nuestros DAOs.

En la interfaz AppDatabase, también hemos utilizado la anotación @Database para indicar qué entidades se van a utilizar en nuestra base de datos, y hemos especificado la versión de la misma.

Para establecer una relación entre nuestras entidades User y Task, debemos crear una clase de pojo que contenga la información de ambas entidades y que sea devuelta por una consulta en nuestro DAO.

Por ejemplo, podríamos crear una clase UserWithTasks que contenga la información de un usuario junto con sus tareas asociadas:

data class UserWithTasks(
    @Embedded val user: User,
    @Relation(
        parentColumn = "id",
        entityColumn = "userId"
    )
    val tasks: List<Task>
)

En esta clase, hemos utilizado la anotación @Embedded para indicar que se trata de una clase que contiene la información de una entidad, y hemos especificado la anotación @Relation para establecer la relación entre la entidad User y la entidad Task.

En esta anotación, hemos indicado qué columna de la entidad User se relaciona con qué columna de la entidad Task.

Para utilizar esta clase en nuestro DAO, podemos crear una consulta que nos devuelva una lista de objetos UserWithTasks:

@Dao
interface UserDao {

    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE id = :id")
    fun getById(id: Int): User

    @Insert
    fun insert(user: User)

    @Transaction
    @Query("SELECT * FROM user")
    fun getAllWithTasks(): List<UserWithTasks>
}

En esta consulta, hemos utilizado la anotación @Transaction para indicar que se trata de una operación transaccional que involucra a varias entidades, y hemos devuelto una lista de objetos UserWithTasks que contiene la información de nuestros usuarios junto con sus tareas asociadas.

De esta manera, podemos crear relaciones entre entidades en Room de manera sencilla y segura, lo que nos permite almacenar y recuperar datos de manera más eficiente y organizada en nuestras aplicaciones móviles.

Conclusión

En resumen, para crear relaciones entre tablas en Room utilizando Kotlin, debemos seguir los siguientes pasos:

  1. Definir nuestras entidades de datos, utilizando la anotación @Entity y especificando las claves primarias de cada una de ellas.
  2. Crear una interfaz que herede de la interfaz RoomDatabase y defina las operaciones que queremos realizar en nuestra base de datos.
  3. Establecer las relaciones entre entidades mediante la anotación @Relation en una clase de pojo que contenga la información de ambas entidades.
  4. Crear una consulta en nuestro DAO que devuelva una lista de objetos que contengan la información de las entidades relacionadas.

Al utilizar estos pasos, podemos crear relaciones entre tablas en Room de manera sencilla y segura, lo que nos permite almacenar y recuperar datos de manera más eficiente en nuestras aplicaciones móviles.

Quizá también te interese…

Cómo simular una base de datos reactiva en Room con Fakes

Cómo simular una base de datos reactiva en Room con Fakes

En el desarrollo de aplicaciones móviles es muy común utilizar bases de datos para almacenar y gestionar la información que se utiliza en la aplicación. En el caso de Android, una de las opciones más populares es Room, una librería de persistencia de datos que...

Descargar una página web en Android con OkHttp

Descargar una página web en Android con OkHttp

En este tutorial vamos a aprender cómo descargar una página web en Android utilizando la librería OkHttp y la librería activity-ktx para facilitar el manejo de los ciclos de vida de nuestra aplicación. Configuración de la App Para empezar, necesitamos incluir las...

Usar Ktor Client para hacer peticiones HTTP en Android

Usar Ktor Client para hacer peticiones HTTP en Android

Ktor es un framework de servidor y cliente de Kotlin diseñado para crear aplicaciones web y móviles de forma rápida y fácil. En este artículo, veremos cómo usar Ktor client en una aplicación Android para hacer peticiones a una API. Configurar las dependencias de Ktor...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de DevExpert, S.L.U., con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *