Una necesidad que nos encontramos muy a menudo en el desarrollo de apps Android es la de persistir nuestros objetos; Guardarlos de manera que sean recuperables en ejecuciones posteriores de nuestra App.
Existen varios mecanismos para implementar esto. Aunque existen otros, el más comúnmente utilizado es la base de datos.
Como sabemos, Android trae soporte nativo para bases de datos SQLite. En las primeras versiones de Android, la gestión de dichas bases de datos se realizaba de forma manual, escribiendo las consultas SQL
y tratando los resultados. Era común el uso de clases como SQLiteOpenHelper, CursorAdater, Cursor o SQLiteDatabase. Hoy día este tipo de implementaciones son menos frecuentes, por el gran trabajo que conlleva manejarlas.
Lo que resulta más rápido y habitualmente se hace es emplear una librería de ORM (mapeo objeto-relacional) que facilite el trabajo al desarrollador.
Algunas de las más frecuentes son SugarORM, OrmLite, GreenDAO, o DBFlow. Vamos a comentar la forma de utilizarlas sin cometer algunos errores que pueden tener un impacto muy negativo en nuestro código.
En este post podrás leer
Importando DBFlow
Tal y como se indica en su repositorio de GitHub, debemos incluir dos dependencias.
En primer lugar, en el settigns.gradle global de nuestro proyecto, incluimos:
Posteriormente, en el build.gradle del modulo app (app/build.gradle), copiamos estos dos bloques:
El primero de ellos en la parte de importaciones (lineas 1-2 del fichero), y el segundo en la parte de dependencias, cuya situación variará segun nuestro proyecto
En este caso estamos usando la versión 2.1.0. Podemos cambiar este número de versión por otro más moderno si lo desearamos, o cambiar el «2.1.0» por «+» para utilizar la última disponible, aunque desaconsejamos esta opción.
Creando las clases necesarias: La clase de base de datos
Una vez tenemos importada la librería, El siguiente paso será crear una clase para modelar cada objeto que queramos persistir.
Cabe destacar que las principales librerías de ORM suelen usar dos enfoques para persistir objetos:
– Que nuestras clases hereden de una clase propia de la librería
– Que nuestras clases incluyan anotaciones en la definición de la clase y/o en sus atributos
El primero sería el caso de SugarORM, mientras que el segundo es el que usa OrmLite. En el caso de DBFlow, utiliza ambos enfoques, necesitaremos extender de BaseModel, y anotar nuestra clase y sus atributos.
En un package convenientemente separado del resto, creamos una clase para modelar nuestra base de datos. En este ejemplo la llamaremos AppDatabase.
Mediante la anotación @Database indicamos a DBFlow como se debe llamar el fichero .sqlite donde estará nuestra base de datos. Este fichero se ubicará en la carpeta /data/data/ de nuestro teléfono y no podremos acceder a él,
salvo que nuestro teléfono esté rooteado y tengamos acceso a su directorio raíz.
Creando las clases necesarias: Las clases de persistencia
Una vez definida la base de datos, pasamos a crear las clases modelo. En nuestra base de datos de ejemplo crearemos una tabla «Estudiante» con objetos que modelen estudiantes.
Creamos una clase y la llamamos StudentDBEntry.
En este ejemplo hemos incluido 4 campos a la clase estudiante: id, nombre, apellido y email. Para manejar nuestra clase cómodamente, incluiremos algunos métodos consultores y modificadores.
En Android Studio, vamos a «Code > Generate…» (o pulsamos ALT+Insert), y seleccionamos «Generate getters and setters».
Seleccionamos todos los atributos pulsando la tecla SHIFT y clicando el ultimo, y pulsamos OK. Generará algo parecido a esto.
Guardando objetos
Hecho esto, ya podemos invocar un objeto de nuestra clase StudentDBEntry y persistirlo. Usaremos el siguiente código dentro de nuestro contexto (Activity, Fragment o similar):
Vemos que el guardado se realiza incluyendo el objeto StudentDBEntry en un array. El motivo de esto es hacer una inserción en bloque o «Bulk insert», que resulta infinitamente más rápida que guardar un objeto individual.
Las latencias de DBFlow a la hora de guardar arrays de objetos es muy baja, independientemente del número de elementos. Es por ello que, aunque insertemos un único objeto, es conveniente que lo hagamos usando esta técnica.
Recuperando objetos guardados
Para recuperar los objetos guardados en el punto anterior tendremos que incluir este bloque de código asíncrono en nuestro contexto (Activity, Fragment o similar)
Y con esto tendríamos un mecanismo básico para persistir y recuperar objetos. En el siguiente volumen de esta serie de artículos veremos la forma más aconsejable de hacer persistencia aplicando principios de Clean Code, reduciendo el acoplamiento de nuestro proyecto con la librería de ORM.
0 comentarios