Saltar al contenido


Hace unos meses publicamos una introducción a Kotlin, un manual para dummies, con la firme intención de volver con más detalles sobre este lenguaje de programación. En este post, cumplimos con lo prometido. 

Esta vez entramos en algunos detalles de código, comentaremos los pasos que hay que ir dando y los conceptos teóricos.  Y además hablaremos de Room, una librería que permite crear bases de datos e interactuar con ellas de manera sencilla. Se ha publicado hace relativamente poco y tiene el soporte oficial de Android, por lo que todo apunta a que la usaremos en muchas ocasiones en nuestros proyectos. Al final del post hemos dejado un enlace al proyecto de Android Studio con la solución. 

El resultado será un app que básicamente hará dos cosas: creará una base de datos con una estructura que definiremos nosotros mismos, y nos permitirá guardar y obtener información de la misma. Podremos añadir un disco al azar a nuestra base de datos, y mostrar el último disco añadido. 

Con todo esto, este post nos debe servir para adentrarnos en la sintaxis de Kotlin y, al mismo tiempo, comprender el funcionamiento básico de Room. A lo largo del post hemos añadido notas con las dudas que fueron surgiendo mientras aprendíamos sobre Kotlin y Room.

Configuración

Empezaremos creando un proyecto nuevo en Android Studio. En la primera pantalla del asistente de nuevo proyecto, debemos marcar la opción Include Kotlin Support para disponer de Kotlin durante el desarrollo.



A continuación, hay añadir las librerías necesarias de Room. Para hacer esto,  incluiremos las siguientes dependencias en el archivo gradle de la app:

implementation "android.arch.persistence.room:runtime:1.0.0" kapt "android.arch.persistence.room:compiler:1.0.0"


En la parte superior del mismo archivo de gradle, debemos importar el siguiente plugin: 

apply plugin: 'kotlin-kapt'


Nota: ¿Que es esto de kapt?
Es el comando para añadir dependencias en usando la herramienta de anotación de Kotlin (Kotlin Annotation processing tool). Dicho de otra forma, donde antes usábamos implementation, ahora podremos usar kapt. 


Tablas

En Room, cada entidad (Entity) representa una tabla, y cada entidad debe ser una clase. En nuestro caso, vamos a definir una tabla que nos permita almacenar los datos de un disco de música. En concreto, vamos a crear una clase llamada Disco.kt Y la anotaremos con @Entity
 

Nota: ¿Qué es esto de las anotaciones? Estas anotaciones son las que convierten clases normales en elementos interpretables por Room. Habrá que utilizarlas continuamente para configurar nuestra base de datos y así conseguir una estructura y propiedades a nuestro gusto.

Si queréis consultar todas las opciones que hay para configurar una tabla, aquí tenéis la documentación oficial


DAOs

También necesitaremos una clase DAO (Data Access Object), que será la que nos permita acceder a la tabla, hay que crear una por cada entidad que tengamos. En nuestro caso, esta clase será DiscoDao.kt  y la anotaremos con @Dao.

Los objetos DAO nos facilitan muchísimo el acceso a la BD. En el proyecto de ejemplo he creado más funciones de las que realmente utilizo, para que tengáis una muestra de lo sencillo que es realizar cada interacción con las tablas (inserción, consulta, borrado, etc.).


Base de datos

Por último, definiremos una clase que nos permitirá la creación de la base de datos como tal. Para ello crearemos el archivo DiscoDatabase.kt y usaremos la anotación @Database  Lo recomendado es que esta clase siga un patrón singleton.  Aquí es donde se indicaran las entidades que formaran la base de datos, la forma de crearla/destruirla, la versión, etc.

Con lo que hemos comentado hasta ahora, ya tendríamos suficiente para crear y manejar la base de datos. De entre las posibles complicaciones que nos podemos encontrar en este primer contacto con Room, solo hay que tener una cosa importante en cuenta: las operaciones de acceso a la base de datos no pueden realizarse en el hilo principal de la app. Si hacemos esto, la app se cerrará abruptamente. Para evitarlo tenemos varias opciones que nos permitirán realizar las operación en segundo plano, como AsyncTask, Handler o RxJava. En nuestro proyecto se usa un Hanlder para lanzar tareas en una nueva hebra, pero es igual de sencillo usar AsyncTask. RxJava es algo más complicado.

 

Nota: Existe una opción, añadiendo allowMainThreadQueries() en el constructor, mediante la cual Room nos permitirá realizar operaciones con la BD en la hebra principal. No deberíamos utilizar esta opción, ya que en los accesos a base de datos se puede “congelar” la app, esto destroza la experiencia de usuario (y no sé vosotros, pero en mi caso, este tipo de cosas acaban suponiendo la desinstalación de la aplicación).


Proyecto

El proyecto de ejemplo lo podéis descargar de este enlace. Es lo más sencillo posible, hay dos botones:

  • Añadir, que elige un disco al azar de una lista estática y lo inserta en la base de datos. 
  • Mostrar el ultimo, que muestra en un texto el resumen del último disco que se ha añadido.

Este código debe servirnos de punto de partida para ahondar en Kotlin (y Android) en futuros posts, pero si os animáis, os proponemos un par de mejoras/tareas muy sencillas:

  • Cambiar la primaryKey de la base de datos, de manera que no se inserte dos veces el mismo disco al pulsar el botón Añadir.
  • En el layout de la actividad principal, he dejado un elemento RecyclerView, que debería rellenarse con al listado de discos completo de la BD. De esta forma, habría que cambiar el segundo botón por un “Mostrar todos”, para que se pintase el listado completo de todos los discos añadidos.

Estaremos encantados de responder a las dudas que os puedan surgir, tanto sobre este artículo como si os atrevéis con las mejoras propuestas.

Álvaro Tinoco
Álvaro Tinoco

Android Senior Developer en BABEL.

logo linkedin compartir en Linkedin Contacto

Otros artículos destacados