Cómo crear una base de datos Room en Android (I)

En este artículo te enseño, con un pequeño proyecto, cómo crear una base de datos Room en Android.

Como te comenté en un artículo anterior, estoy aprendiendo a programar aplicaciones para Android realizando proyectos. Con Android Programming: The Big Nerd Ranch Guide aprendí a crear bases de datos utilizando SQLite, que implica escribir bastante digo. Por esa razón, no tardé mucho en encontrar una solución más sencilla: utilizar una base de datos Room en Android.

¿Qué es una base de datos Room en Android?

Esta explicación va a ser breve y lo menos técnica posible:

  • SQLite es un software que se utiliza (aparte de para otras muchas aplicaciones) para crear bases de datos en aplicaciones para Android. Ya sabes: cierras una aplicación, la vuelves a abrir, y los datos que introdujiste siguen ahí.
  • Room, presentado en la conferencia Google I/O de 2017, simplifica el uso de SQLite (como verás a continuación). 

A esto se reduce el mínimo conocimiento teórico que tienes que saber. A continuación te voy a explicar, con un ejemplo práctico, cómo crear una base de datos Room en Android.

Cómo crear una base de datos Room en Android

1._ Crea un proyecto en Android Studio

Abre Android Studio, y haz clic en File > New... > New Project.... En Application Name introduce Mi nota.  Puedes dejar el Company Domain que te aparece de manera predeterminada. Pulsa Next.

Cómo crear una base de datos ROOM en Android

A continuación, selecciona la versión de Android más antigua con la que va a funcionar tu aplicación. Yo siempre selecciono la 6 (puedes utilizar la versión que quieras). Pulsa Next.

Android Studio - seleccionar la versión mínima de SDK

Selecciona Empty Activity, y pulsa Next.

Selecciona Empty Activity en Android Studio

Deja los valores predeterminados y pulsa Finish para crear el proyecto.

Selecciona Finish para crear el proyecto

Espera unos segundos mientras se crea el proyecto.

¿Sabes que te regalo un curso de Android Studio si te suscribes?

Aprenderás todo lo que necesitas saber para crear una aplicación, sincronizarla con un repositorio git, exportar el archivo .apk de la aplicación y, como bonus, cómo publicarla en Google Play (además, recibirás también un curso gratuito de IntelliJ IDEA, y te avisaré cada vez que publique un curso nuevo).

2._ Añade RoomDatabase a tu proyecto

Copia/pega las siguientes dos líneas en build.gradle (Module: app):

Añadir RoomDatabase al proyecto

Si al copiar/pegar te salen marcados de amarillo, es porque existe una versión más nueva. En ese caso, pincha las líneas marcadas de amarillo (una cada vez), pulsa Alt + Intro y selecciona la primera opción del menú.

Acto seguido, haz clic en Sync Now, arriba a la derecha.

3._ Crea el Schema de tu base de datos

El Schema es la estructura de la base de datos. Con anterioridad a la aparición de las bases de datos Room era algo que tenías que hacer manualmente; ahora Room se ocupa de generarlo de manera automática en un archivo con extensión .json.

Para ello, introduce las siguientes líneas en build.gradle (Module: app):

El archivo se generará en la carpeta app/schemas/<paquete de tu proyecto>; el nombre se corresponde con la versión correspondiente de la base de datos: 1.json, 2.json, etc.

4._ Crea la clase Nota

Esta aplicación va a constar de una única pantalla, en la que podrás introducir una nota que se guardará en la memoria del dispositivo (en la base de datos Room que vas a aprender a crear en este artículo).

Para crear la nueva clase, haz clic con el botón derecho en el paquete del proyecto, y haz clic en New > Java class.

Crear una clase en Android Studio

La clase se va a llamar Nota.

Introduce el nombre de la clase en la ventana

Va a constar de dos elementos: una id y el contenido de la nota, ambos de tipo String.

Si Android Studio te marca algo con rojo (como lo hará con UUID), pon el cursor encima y pulsa Alt + Intro para importar el paquete necesario.

Genera en Android Studio el constructor (que asigna el mId a cada elemento), y los getters y setters de todos los elementos, incluso de mId, aunque no lo uses, porque la base de datos lo va a necesitar.

Anotaciones utilizadas

 (Las anotaciones son las etiquetas con una @ al principio.)

  • @Entity(tableName = "nota")

Esta anotación hace referencia a que es una instancia de esta clase lo que vamos a guardar en la base de datos. No es obligatorio especificar el nombre de la tabla de la base de datos; de manera predeterminada recibe el nombre de la clase (SQLite no distingue entre mayúsculas y minúsculas). Así, en este caso la clase se llamaría nota de todas formas.

El resto de anotaciones describen la estructura de la tabla en la base de datos:

  • @PrimaryKey

Identifica a cada objeto y no puede ser null. Por esta razón, le he asignado esta anotación (@NonNull) al campo mId.

  • @ColumnInfo(name="contenido")

Esta anotación se utiliza para definir una columna, en el sentido de que le damos un nombre a la columna y, a continuación, le asignamos un campo.

Cómo crear una base de datos Room en Android, en 5 minutos. #android

Compártelo

5._ Crea la base de datos Room en Android

5.1 ._ Crea la clase que instancia la base de datos (NotaDatabase)

Esta clase es diminuta; se trata de una clase abstracta que contiene un único método abstracto, cuya devolución es una instancia de la interfaz que contiene los métodos que gestionan la base de datos.

Crea la clase igual que la anterior, pero llámala database.NotaDatabase y que extienda RoomDatabase; además, hazla abstracta.

Al darle ese nombre, estarás creando una subcarpeta, en la que guardarás los dos archivos de la base de datos:

Crea la base de datos ROOM en Android Studio

Selecciona el elemento que te sugiere Android Studio y pulsa OK

El contenido de esta clase es el que sigue:

Nota.class se trata de la clase cuyos objetos vas a guardar en la base de datos; el número de versión empieza a contar por 1 y tienes que cambiarlo cada vez que modifiques la base de datos.

Haz, con Alt + Intro, todos los imports que sean necesarios. NotaDao te saldrá marcado de color rojo porque aún no existe, pero estamos a punto de crearla.

5.2 ._ Crea la interfaz que gestiona la base de datos (NotaDao)

Pon el cursor en la devolución del método que acabas de crear, ese NotaDao rojo. Pulsa Alt + Intro y selecciona Create interface 'NotaDao':

Crea una interfaz en Android Studio

Acepta las opciones predeterminadas en la ventana que se te abra. Se te creará la interfaz en el subpaquete database que creaste antes. Márcala como public.

Esta interfaz que acabas de crear contiene una serie de métodos para modificar la base de datos, así como para extraer los datos almacenados.

Métodos de la interfaz NotaDao
  • database
    getNotas, para extraer todas las notas guardadas en la base de datos. En este caso, habrá solamente una.
  • getNota, para extraer una nota a partir de su id.
  • addNota, para crear una nota nueva en la base de datos.
  • deleteNota, para borrar una nota de la base de datos.
  • updateNota, para actualizar una nota que ya existe en la base de datos.

Como ves, entre paréntesis se utiliza sintaxis SQL. "SELECT * FROM nota" equivale a decir "Selecciónalo todo de la base de datos llamada nota"; "SELECT * FROM nota WHERE mId LIKE :uuid" equivale a "Selecciona todos los objetos (hay uno por fila) donde el campo mId coincide con el parámetro uuid".

5.3 ._ Crea una clase que haga uso de la interfaz NotaDao

La base de datos Room en Android ya está creada; lo único que queda es hacer uso de la interfaz NotaDao, y a continuación pasaremos a crear la interfaz de usuario.

Crea una nueva clase, y llámala NotaLab. Vamos a utilizar una instancia de NotaLab para interactuar con la base de datos.

Qué tienes que saber sobre la clase NotaLab:
  • Esta clase es un singleton. Esto significa que solo va a existir una única instancia de NotaLab; para asignar un objeto de tipo NotaLab a una referencia haremos una llamada a un método estático que precisa un argumento: un objeto de tipo Context. Este método comprueba si la única instancia de NotaLab existe ya; si no, la instancia.
  • Dentro del constructor extraemos un nuevo objeto de tipo Context del objeto de ese mismo tipo recibido. Esto es imprescindible para evitar fugas de memoria, como bien indica Android Studio. Con esto, el problema queda resuelto, aunque Android Studio sigue marcándolo. De ahí que haya añadido la anotación @SuppressLint("StaticFieldLeak").
  • Al instanciar NotaDatabase he utilizado el método allowMainThreadQueries(). Este método permite interactuar con la base de datos sin crear un hilo de ejecución paralelo (lo que es algo más complejo). Como la base de datos es muy pequeña, no es necesario. 

Los métodos de la clase NotaLab hacen una llamada a los métodos de la interfaz NotaDao, sin implementarlos. Como ya te dije al principio, la base de datos Room en Android simplifica muchísimo el funcionamiento de las bases de datos SQLite.

6._ Crea la interfaz de usuario

La interfaz va a ser muy sencilla. Constará de un RelativeLayout que contendrá un campo de texto, donde introducir el texto de la nota, y dos botones: GUARDAR (que servirá tanto para crear una nota nueva como para actualizar una nota que ya existe) y BORRAR.

Si introduces en la configuración de la interfaz de usuario texto (como el nombre de los botones, por ejemplo) Android Studio lo va a marcar de amarillo, para que, en lugar de texto utilices una referencia a dicho texto. Así, puedes traducir dicho texto a varios idiomas y el usuario podrá ver la interfaz en el idioma de su dispositivo.

Aviso de texto en Android Studio

Pon el cursor en el texto que quieres convertir en una referencia, pulsa Alt + Intro y selecciona Extract String resource. Especifica un Resource name si no lo hay, y pulsa OK.

Extract resource Android Studio

El texto al que se hace referencia a partir de ahora en el código se encuentra en res/values/strings.xml.

La interfaz de usuario queda tal y como se ve en la siguiente imagen:

Interfaz en Android Studio

A continuación, toca conectar la interfaz de usuario con el código Java.

7 ._ Conecta la interfaz de usuario con el código Java

  • En primer lugar, declararemos los objetos que tenemos en la interfaz de usuario: un objeto de tipo EditText y dos de tipo Button.
  • A continuación, dentro del método onCreate en MainActivity, que se ejecuta cuando se inicia la aplicación, instanciaremos dichos objetos y les configuraremos listeners, es decir, unas líneas de código para que la interfaz esté a la espera de interacción por parte del usuario. Un onClickListener, por ejemplo, reacciona cuando un usuario pulsa un botón.
  • Por último, crearemos los métodos que ejecutarán dichos listeners cuando se produzca una interacción: guardar/actualizar la nota cuando el usuario pulsa guardar, y borrar cuando pulse borrar. Aparecerá un Toast con información sobre la acción realizada.

Instala la aplicación en un dispositivo Android, guarda una nota y cierra y vuelve a abrir la aplicación: la nota aparecerá en el campo de texto. ¡CONSEGUIDO! Has aprendido a crear una base de datos Room en Android. Fácil, ¿verdad?

En la próxima entrada te enseñaré a acceder a la base de datos creando un nuevo hilo de ejecución, y cómo modificarla sin perder los datos almacenados.

¿Te atreves a hacer más compleja esta aplicación?

 MiNota es una app muy básica, ¿te atreves a usarla como ejercicio para practicar? Por ejemplo, puedes crear un nuevo método en MainActivity que se encargaría de mostrar los Toasts¡Anímate y cuéntame tu experiencia en los comentarios!

Sección de comentarios cerrada