Menú Navegación Páginas

El blog de Antonio Leiva sobre diseño y desarrollo de interfaces en Android

GreenDAO: olvídate de SQLite con un ORM para Android

GreenDAO: olvídate de SQLite con un ORM para Android
  • Twitter
  • Facebook
  • Google Plus
  • LinkedIn

Bastante harto de SQLite (sí, no sé si lo podrían haber hecho más complicado), me puse a buscar alternativas, y di con GreenDAO. Básicamente se trata de un ORM (Object-relational mapping) para Android que lo que te permite es tratar los registros de una base de datos como objetos en tu código de manera transparente.

¿Qué conseguimos con esto? Realizar las tareas CRUD (create-read-update-delete) mediante objetos en vez de tener que utilizar consultas directas.

greenDAO

Hay varios de este estilo para Android, pero me quedo con GreenDAO porque supera en velocidad a su más directo competidor (ORMLite) y la librería ocupa bastante menos.

En la página Web tenéis un enlace para descargar un par de proyectos que incluyen un ejemplo con el que trastear. Aquí sólo pretendo contar un poco como funciona, la curiosidad hará el resto.

Creación de la base de datos con greenDAO

Para crear una base de datos, la recomendación es utilizar un proyecto aparte con el que podemos generar todas las clases necesarias. Lo más fácil es usar el GreenDAOGenerator que habrás descargado de su Github.

Lo primero es crearse un elemento de tipo Schema, indicando el nombre del paquete para las clases que vas a generar. Por ejemplo:

Schema schema = new Schema(1, "com.limecreativelabs.ejemplodao");

Al esquema se le pueden añadir Entities, que a nivel de base de datos se corresponde con las tablas. A estas entidades se les indica qué campos van a tener realizando simples llamadas a métodos:

Entity empleado = schema.addEntity("Empleado");
empleado.addIdProperty();
empleado.addStringProperty("nombre");
empleado.addStringProperty("apellidos");
empleado.addStringProperty("puestoDeTrabajo");
emplado.addIntProperty("edad");

La property de tipo ID se corresponde con el estándar de SQLite, que implica generar un campo con el nombre “_id” de tipo long. Los nombres de las columnas, a nivel de curiosidad, los genera en mayúsulas y separando palabras por guiones donde hay mayúsculas. Así puestoDeTrabajo genera un campo PUESTO_DE_TRABAJO.

Para la generación de las clases para trabajar con la BD se necesita indicar la carpeta donde queremos que se despliegue:

DaoGenerator daoGenerator = new DaoGenerator();
daoGenerator.generateAll(schema, "../MiProyecto/src-gen");

Ya tenemos listas las clases con las que trabajar.

Operaciones CRUD con greenDAO

Las operaciones básicas se convierten ahora en algo muy simple. Primero se necesita recuperar el acceso a la base de datos de empleados:

DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "empleados-db", null);
db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
EmpleadoDao empleadoDao = daoSession.getEmpleadoDao();

Con empleadoDao ya puedo realizar todo tipo de operaciones contra la base de datos.

Creación

Crear un empleado es tan fácil con instanciar un objeto e insertarlo mediante empleadoDao:

Empleado e = new Empleado(null, "Antonio", "Leiva", 27);
empleadoDao.insert(e);

Borrado

Igual de sencillo. El borrado se realiza mediante id:

empleadoDao.deleteByKey(id);

Actualización

Modifica lo que quieras en el objeto y utiliza el método update:

e.setEdad(28);
empleadoDao.update(e);

Consultas

Con el método queryBuilder, se pueden hacer consultas sin necesidad de SQL, muy al estilo de Linq de .NET. Os pongo un ejemplo, pero esta es la parte más compleja, así que lo mejor es visitar la documentación:

List empls = empleadoDao.queryBuilder()
.where(Properties.Nombre.eq("Antonio"))
.orderAsc(Properties.Edad)
.list();

Conclusión

Si soy sincero, aún no lo he probado en un proyecto real, pero tengo muy buenas referencias de esta librería y por lo que he podido probar simplifica mucho el tratamiento de registros con la base de datos, que personalmente me parece una de las tareas más tediosas de tratar. Directamente lo voy a probar en un proyecto que tengo empezado y ya os contaré la experiencia. Si alguien se anima o lo conoce, me encantaría saber su opinión.

¿Te ha gustado? Compártelo

16 Comentarios

  1. Interesante, aunque no tengo nada en contra de SQLite, sí que tener una capa de mayor nivel de abstracción es muy interesante (bueno, me refiero a que te la den hecha, supongo que todos nos hacemos nuestra propia capa de abstracción…).

    Me pregunto si gestiona él solo la actualización del esquema de la base de datos si añades cambios en nuevas versiones. Si fuera así facilita bastante la vida al no andar preocupándose de las versiones del esquema.

    • Sí, básicamente lo digo por el tiempo que ahorra generarse la capa de abstracción de la que hablas. El otro día echando cuentas de lo que tardé en crear un tabla y crear la clase de acceso me dije que tenía que encontrar en otra manera. En .NET hago lo mismo en poco más de 5 minutos. Sé que no es comparable, pero hay tecnologías similares.

      Con respecto a lo de la actualización del esquema, tengo la sospecha de que el “1” del Scheme es la versión. Sería generar las clases con un “1” y otra vez con un “2” y meterse en el código para ver qué ha hecho con el método de upgrade. La verdad es que no he investigado este tema.

      • HOLA DISCULPA SOSY NUEVO EN ESTO DE ANDROID PODRIAN EXPLICARME COMO IMPLEMENTO O PONGO ESA LIBRERIA PARA QUE ME GENERE LAS CLASES NO ENTIENDO ESA MARTE EN GREENDAO ME DA LOS PASOS PERO NO FUNCIONA SULUDOS

  2. Hola, buenas, yo la verdad es que no soy ningun experto, la verdad es que SQLite, es un poco tedioso, y me encontre un proyecto llamada ADA Framework ( creo que es un proyecto español ), te voy a exponer un par de cosillas ( aclaro que no soy un experto ):

    – Puedes generar la base de datos y las tablas en el mismo proyecto que estas realizando.
    – Las tablas son clases, y sus atributos son columnas y usa anotaciones para dar sus propiedades en la tabla.

    • Pues suena bastante bien. Lo investigaré un poco. Gracias!

    • Buscando ORMs para mejorar el manejo de BBDD dí primero con GreenDAO y después de intentarlo me he encontrado con ADA Framework gracias a @caspol en este mismo comentario. Gracias!!!

      Son dos aproximaciones al mismo problema por vías distintas, parece que la aproximación de GreenDAO puede ser más eficiente pero en mi caso he seleccionado ADA por sencillez en el código, curva de aprendizaje y mantenimiento.

      Al final de cuentas no voy a manejar grandes conjuntos de datos y milisegundo arriba o milisegundo abajo no me va a suponer mucho.

  3. Gracias Antonio, interesante lo de GreenDao. Aunque en realidad a mi me va bien con SQLite. Yo lo único que pediría que hicieran es la posibilidad de ponerle protección (contraseña de apertura) a las BBDD.
    No entiendo que no haya forma de protegerte tus BBDDs. Sabéis si con GreenDao se puede?
    Saludos!

    • greenDao no aporta nada al respecto. He visto que hay alguna librería para encriptar la BD, igual puedes investigar por ese camino.

      • Gracias Antonio, le echo un vistazo y si descubro algo útil comento por aquí.

  4. antonio me puedes mandar este ejemplo pero para correrlo en mi pc y visualizarlo mejor

  5. Muy util! Estoy empezando un proyecto y el SQLite es muy tedioso. Pero… ¿es posible cargar una base de datos desde GreenDAO? gracias.

Deja tus comentarios

¿Has probado ya Bandhook? Te presento mi nueva aplicación, en la que podrás consultar información de tus artistas favoritos y descubrir otros nuevos relacionados.

Bandhook - Discover new music