Usando la base de datos de la sala | Android Jetpack

Ashish Rawat

Follow

Feb 23, 2019 – 6 min read

Para aquellos que no sepan qué es Android Jetpack entonces

Android Jetpack es una colección de componentes de software Android para facilitarte el desarrollo de grandes aplicaciones Android.
Te ayudarán a

  • Seguir las mejores prácticas
  • Liberarte de escribir código boilerplate.
  • Simplificar tareas complejas, para que puedas centrarte en el código que te importa.

Aquí tienes el vídeo del Canal de Desarrolladores de Android:

Ahora hablemos de Room

Room es una librería de persistencia, parte de Android Jetpack.

Aquí está el vídeo del canal de desarrolladores de Android:

Room proporciona una capa de abstracción sobre SQLite para permitir un acceso fluido a la base de datos mientras se aprovecha toda la potencia de SQLite.

Room se considera ahora como un mejor enfoque para la persistencia de datos que SQLiteDatabase. Hace que sea más fácil trabajar con objetos SQLiteDatabase en su aplicación, disminuyendo la cantidad de código repetitivo y verificando las consultas SQL en tiempo de compilación.

  • Verificación en tiempo de compilación de las consultas SQL. cada @Query y @Entity se comprueba en tiempo de compilación, que preserva su aplicación de problemas de bloqueo en tiempo de ejecución y no sólo comprueba la única sintaxis, sino también las tablas que faltan.
  • Código de la plantilla
  • Se integra fácilmente con otros componentes de la Arquitectura (como LiveData)

Los principales problemas con el uso de SQLite son

  • No hay verificación en tiempo de compilación de las consultas SQL en bruto. Por ejemplo, si escribe una consulta SQL con un nombre de columna incorrecto que no existe en la base de datos real, dará una excepción durante el tiempo de ejecución y no podrá capturar este problema durante el tiempo de compilación.
  • Cuando su esquema cambia, necesita actualizar las consultas SQL afectadas manualmente. Este proceso puede llevar mucho tiempo y ser propenso a errores.
  • Tienes que usar mucho código de caldera para convertir entre consultas SQL y objetos de datos Java (POJO).

Room vs SQLite

Room es una librería ORM, Object Relational Mapping. En otras palabras, Room mapeará nuestros objetos de la base de datos a objetos Java. Room proporciona una capa de abstracción sobre SQLite para permitir un acceso fluido a la base de datos aprovechando toda la potencia de SQLite.

Diferencia entre SQLite y la librería de persistencia Room:-

  • En el caso de SQLite, no hay verificación en tiempo de compilación de las consultas SQLite en bruto. Pero en Room, hay validación de SQL en tiempo de compilación.
  • Hay que usar mucho código boilerplate para convertir entre consultas SQL y objetos de datos Java. Pero, Room mapea nuestros objetos de base de datos a Java Object sin código boilerplate.
  • Cuando su esquema cambia, necesita actualizar las consultas SQL afectadas manualmente. Room resuelve este problema.
  • Room está construido para trabajar con LiveData y RxJava para la observación de datos, mientras que SQLite no.
Room es impresionante

Componentes de Room DB

Room tiene tres componentes principales de Room DB :

  • Entidad
  • Dao
  • Base de datos

Entidad

Representa una tabla dentro de la base de datos. Room crea una tabla para cada clase que tenga @Entity anotación, los campos de la clase se corresponden con columnas de la tabla. Por lo tanto, las clases de entidad tienden a ser pequeñas clases modelo que no contienen ninguna lógica.

Anotaciones de entidades

Antes de empezar a modelar nuestras entidades, necesitamos conocer algunas anotaciones útiles y sus atributos.

@Entidad – cada clase modelo con esta anotación tendrá una tabla de mapeo en la BD

  • foreignKeys – nombres de las claves foráneas
  • indices – lista de indicaciones en la tabla
  • primaryKeys – nombres de las claves primarias de la entidad
  • tableName

@PrimaryKey – como su nombre indica, esta anotación señala la clave primaria de la entidad. autoGenerate – si se establece en true, entonces SQLite generará un id único para la columna

@PrimaryKey(autoGenerate = true)

@ColumnInfo – permite especificar información personalizada sobre la columna

@ColumnInfo(name = "column_name")

@Ignore – el campo no será persistido por Room

@Embeded – los campos anidados pueden ser referenciados directamente en las consultas SQL.

Dao

DAOs se encargan de definir los métodos que acceden a la base de datos. En el SQLite inicial, utilizamos los objetos Cursor. Con Room, no necesitamos todo el código relacionado con Cursor y podemos simplemente definir nuestras consultas usando anotaciones en la clase Dao.

Database

Contiene el soporte de la base de datos y sirve como punto de acceso principal para la conexión subyacente a los datos relacionales y persistentes de tu app.

Para crear una base de datos necesitamos definir una clase abstracta que extienda RoomDatabase. Esta clase se anota con @Database, enumera las entidades contenidas en la base de datos, y los DAOs que acceden a ellas.

La clase que se anota con @Database debe satisfacer las siguientes condiciones:

  • Ser una clase abstracta que extiende RoomDatabase.
  • Incluir la lista de entidades asociadas a la base de datos dentro de la anotación.
  • Contiene un método abstracto que tiene 0 argumentos y devuelve la clase que está anotada con @Dao.

En tiempo de ejecución, se puede adquirir una instancia de Database llamando a Room.databaseBuilder() oRoom.inMemoryDatabaseBuilder().

Paso 1: Añadir las dependencias de Gradle

  1. Para añadirlo a tu proyecto, abre el archivo build.gradle de nivel de proyecto y añade la línea resaltada como se muestra a continuación:

2. Abra el archivo build.gradle de su aplicación o módulo y añada las dependencias:

Paso 2: Crear una clase modelo

Room crea una tabla para cada clase anotada con @Entity; los campos de la clase se corresponden con las columnas de la tabla. Por lo tanto, las clases de entidad tienden a ser pequeñas clases modelo que no contienen ninguna lógica. Nuestra clase Person representa el modelo de los datos en la base de datos. Así que vamos a actualizarla para decirle a Room que debe crear una tabla basada en esta clase:

  • Anota la clase con @Entity y utiliza la propiedad tableName para establecer el nombre de la tabla.
  • Establezca la clave primaria añadiendo la anotación @PrimaryKey a los campos correctos – en nuestro caso, este es el ID del Usuario.
  • Establezca el nombre de las columnas para los campos de la clase utilizando la anotación @ColumnInfo(name = "column_name"). Siéntase libre de omitir este paso si sus campos ya tienen el nombre correcto de la columna.
  • Si varios constructores son adecuados, agregue la anotación @Ignore para decirle a Room cuál debe ser utilizado y cuál no.

Paso 3: Crear objetos de acceso a datos (DAOs)

Los DAOs se encargan de definir los métodos que acceden a la base de datos.

Para crear un DAO necesitamos crear una interfaz y anotarla con @Dao .

Paso 4 – Crear la base de datos

Para crear una base de datos necesitamos definir una clase abstracta que extienda RoomDatabase. Esta clase está anotada con @Database, lista las entidades contenidas en la base de datos, y los DAOs que acceden a ellas.

Paso 4: Gestionar los datos

Para gestionar los datos, en primer lugar, necesitamos crear una instancia de la base de datos.

Entonces podemos insertar borrar y actualizar la base de datos.

Asegúrate de que toda la operación debe ejecutarse en un hilo diferente. En mi caso utilizo Executers (ver aquí)

Query:

Insert:

Borrar:

Actualizar:

Ejecutando con Executer

También he enlazado un repo por si necesitas ver el ejemplo de Room Database.

Deja un comentario