Llegamos al penúltimo capítulo de esta serie acerca de Adobe AIR. Hoy veremos como trabajar en local con datos persistentes de manera que podamos recuperarlos en otras sesiones. Al decir en local me refiero a que no se necesita conexión a Internet para salvaguardarlos, no se utilizará una base de datos remota sino el propio ordenador del cliente.
A diferencia de las aplicaciones Flash embebidas en un navegador, AIR permite el acceso completo al sistema de archivos del sistema operativo, no tiene las limitaciones de la máquina virtual Flash ni las políticas de seguridad, así que podemos crear, abrir, modificar y guardar cualquier archivo.
Si unimos todo esto con sqlite obtenemos lo que buscamos ya que AIR trae soporte nativo para sqlite con lo que guardar y consultar datos con sentencias sql no será un problema, más sencillo imposible.
AIR permite dos modos de trabajo con sqlite, síncrono y asíncrono. La diferencia es obvia, en el primer tipo se espera a que la ejecución de las instrucciones sql termine para continuar la ejecución de la aplicación, mientras que en el modo asíncrono se utilizan eventos que se disparan cuando se da por finalizada la consulta. En modo sincrono debemos ejecutar todo enjaulado en estructuras try/catch para prevenir errores y excepciones.
Aunque puedes crear la base de datos directamente desde la propia aplicación con sentencias CREATE TABLE, yo prefiero distribuir la aplicación con la base de datos ya creada, es mucho más cómodo. Para crearlas suelo usar dos utilidades:
- Sqlite Database Browser. Sencilla y freeware.
- SQLite2008 Pro Enterprise Manager. También freeware pero mucho más potente. En el link que he puesto está al final de la página.
También puedes hacer tu propia aplicación AIR para gestionar bases de datos sqlite, no conozco ninguna pero sería muy útil. ¿Quién se atreve? 🙂
Con cualquiera de ellas podremos crear la estructura de nuestra base de datos que copiaremos en el directorio del código fuente, para que al compilarla y empaquetarla se distribuya con ella.
Como no todos los sistemas operativos permiten a cualquier usuario escribir en la ruta de instalación de las aplicaciones, lo mejor y más recomendable es copiar la base de datos “base” en la carpeta de usuario del cliente que está ejecutándola ya que ahí siempre tiene permisos. Para hacerlo AIR nos provee de todos los mecanismos necesarios.
Con los métodos userDirectory y applicationDirectory de la clase File accedemos a las rutas de usuario y de la aplicación respectivamente independientemente del sistema operativo sobre el que está corriendo la aplicación, con lo cual hacemos el proceso completamente transparente.
var a:File=File.userDirectory.resolvePath("basedatos.db"); if(!a.exists){ var b:File=File.applicationStorageDirectory.resolvePath("basededatos.db"); b.copyTo(a, true); }
Sencillo y evidente, sobran más explicaciones. Sabiendo esto es ya muy fácil conectar a la base de datos. Utilicemos el método síncrono antes comentado.
private var dbFile:File; private var conn:SQLConnection; private var q:SQLStatement; private function iniciaDB():void { var dbFile:File=File.userDirectory.resolvePath("basededatos.db"); if(!dbFile.exists){ var b:File=File.applicationStorageDirectory.resolvePath("basededatos.db"); b.copyTo(dbFile, true); } conn = new SQLConnection(); try{ conn.open(dbFile); }catch (error:SQLError){ Alert.show("ERROR ABRIENDO BBDD "+error.message+" "+error.details); } }
¡Ya estamos dentro de la base de datos! Sólo nos queda ejecutar consultas y recuperar los resultados. No tiene mucha ciencia. Veamos un ejemplo para que queda bien claro.
var q:SQLStatement; var result:SQLResult; q.text = "SELECT campo1, campo2 FROM tabla"; try{ q.execute(); result=q.getResult(); if(result.data){ var numResults:int = result.data.length; for (var i:int = 0; i < numResults; i++){ var r:Object = result.data[i]; //accedemos a los campos desde el objeto, r.campo1, r.campo2 } } }catch (error:SQLError){ //la consulta nos ha devuelto un error }
Eso es todo como iniciación sqlite desde AIR. Del mismo modo se pueden ejecutar instrucciones INSERT, DELETE…
A partir de aquí puede seguir cualquiera 😛 .
En el próximo y último capítulo veremos como hacer ventanas de notificación instantáneas y no intrusivas, del estilo de los avisos de conexión del Messenger 😉 .