Trabajando con SQLite, AIR y FLASH CS3
Air desde su versión beta 2 si no mal recuerdo trae integrado un engine de base de datos SQL mediante SQLite.
¿Que significa esto?
Significa que podemos crear base de datos locales desde nuestra aplicación de AIR sin la necesidad de que el usuario final instale nada más que el Runtime de AIR.
Con esto podemos crear eliminar modificar bases de datos, tablas, registro etc.
Para propósitos de este tutorial vamos a crear un simple cliente que cree una base de datos si no existe, que cree la tabla con la cual trabajaremos y donde consultaremos, agregaremos y eliminaremos entradas.
Cabe mencionar que para efectos prácticos no posteare todo el código en cada ejemplo. Al final del tutorial estará la clase final así como los archivos fuente para su estudio
Creación de Base de Datos
Al ser una base de datos local, evidentemente dicho archivo se tiene que crear en la maquina del usuario, para saber si la base de datos existe o no, debemos verificar si el archivo existe, para ello hacemos uso de la Clase File
[as]
package com.tmeister.samples.sql
{
import flash.filesystem.File;
public class sqlSample extends MovieClip
{
private var db:File;
public function sqlSample()
{
db = File.applicationStorageDirectory.resolvePath(“myFirst.db”);
(!db.exists) ? createDatabase() : dbExist();
}
private function createDatabase()
{
trace(“Creamos la BD”)
}
private function dbExist()
{
trace(“La Base de datos ya existe”)
}
}
}
[/as]
Con esto sabremos si la base de datos existe o no, si dicha base de datos no existe debemos crearla, pero antes de poder crearla debemos crear una instancia de la clase SQLConnection para poder conectarnos con el engine y después de esto entonces si crear la BD.
[as]
//Importamos las clases para trabajar con SQLite
import flash.data.SQLConnection;
import flash.events.SQLErrorEvent;
import flash.events.SQLEvent;
//Creamos una nueva conexion y seteamos sus respectivos handlers
conn = new SQLConnection();
conn.addEventListener(SQLEvent.OPEN, dbConnOpen);
conn.addEventListener(SQLErrorEvent.ERROR, dbConnError);
//”Abrimos” la base de datos, si no existe se crea
conn.openAsync(db);
// Handlers de los eventos
private function dbConnOpen(e:SQLEvent)
{
trace(“Se conecto a la base de datos “)
trace(“Ya podemos hacer uso de la base de datos.”)
}
private function dbConnError(e:SQLErrorEvent)
{
trace(“Error al conectarse a la base de datos”);
trace(e)
}
[/as]
En esta parte de código asignamos 2 listeners a conn que es nuestra conexión con el engine, Los listeners son:
- SQLEvent.OPEN : El cual se ejecuta cuando la base de datos esta lista para ser usada.
- SQLErrorEvent.ERROR : El cual se ejecuta si un error ocurrió al momento de intentar acceder a la base de datos.
La línea “mágica” es
[as]
conn.openAsync(db);
[/as]
Con esta instrucción abrimos la base de datos pasando como referencia el archivo respectivo, si el archivo no existe se crea automáticamente. Hay dos formas de trabajar con SQLite, de forma Síncrona o Asíncrona, en este ejemplo trabajamos con la segunda opción, en una entrada posterior tratare de explicar las diferencias entre cada una de ellas.
Con esto ya tenemos una base de datos creada ahora lo siguiente es crear un tabla
Creación de Tablas
Una vez que ya tenemos nuestra base de datos ahora necesitamos una tabla en donde insertar datos.
Las interacciones hacia la base de datos es exactamente igual que en otros lenguajes de programación (dígase PHP), se crea la conexión a la base de datos se escribe el SQL y se ejecuta la instrucción.
Lo único que cambia en AS3 es que debemos crear una instancia de la clase SQLStatement en la cual seteamos que conexión a DB usar, asignar la cadena de consulta o ejecución (SQL) y asignar los valores.
Todo esto se resume a lo siguiente.
[as]
import flash.events.SQLErrorEvent;
import flash.events.SQLEvent;
private const TABLE_NAME:String = “people”
//Creamos una instancia de la clase
var dbManager:SQLStatement = new SQLStatement();
//Asignamos la conexion a la base de datos
dbManager.sqlConnection = conn
//Asignamos listeners a los eventos
dbManager.addEventListener(SQLErrorEvent.ERROR, sqlError);
dbManager.addEventListener(SQLEvent.RESULT, tableResult);
//Sentencia a ejecutar
var sql:String = “CREATE TABLE ” + TABLE_NAME + ” (“;
sql += “id INTEGER PRIMARY KEY AUTOINCREMENT,”
sql += “name TEXT,”;
sql += “age NUMERIC”;
sql += “)”;
//La sentencia SQL debe ser asignada a la propiedad text del SQLStatement
dbManager.text = sql;
//Por ultimo ejecutamos la sentencia
dbManager.execute();
//Handlers
private function tableResult(e:SQLEvent)
{
trace(“La tabla se creo correctamente”);
}
private function sqlError(e:SQLErrorEvent)
{
trace(“Error: “+ e.error.message);
trace(“Detalles: “+ e.error.details);
}
[/as]
Inserts
Como mencione antes todas las interacciones con la base de datos se deben de hacer mediante una instancia de la clase SQLStatement. Lo único que cambia de acuerdo con el ejemplo anterior (Creación de tablas) es la sentencia SQL y la asignación de los valores de los campos.
Ejemplo de Insert
[as]
import flash.events.SQLErrorEvent;
import flash.events.SQLEvent;
//Creamos una instancia de la clase
var insertManager:SQLStatement = new SQLStatement();
//Asignamos la conexion a la base de datos
insertManager.sqlConnection = conn;
//Asignamos listeners a los eventos
insertManager.addEventListener(SQLEvent.RESULT, insertResult);
insertManager.addEventListener(SQLErrorEvent.ERROR, sqlError);
//Sentencia a ejecutar
var sql:String = “INSERT INTO ” + TABLE_NAME + ” (name, age) VALUES (:name, :age)”;
//Asignacion de valor a los parametros de la sentencia
insertManager.parameters[":name"] = “Tmeister”;
insertManager.parameters[":age"] = “29″;
//La sentencia SQL debe ser asignada a la propiedad text del SQLStatement
insertManager.text = sql;
//Por ultimo ejecutamos la sentencia
insertManager.execute();
//Handlers
private function tableResult(e:SQLEvent)
{
trace(“La tabla se creo correctamente”);
}
private function sqlError(e:SQLErrorEvent)
{
trace(“Error: “+ e.error.message);
trace(“Detalles: “+ e.error.details);
}
[/as]
Aqui vemos cosas nuevas en la sentencia.
Primero
[as]
var sql:String = “INSERT INTO ” + TABLE_NAME + ” (name, age) VALUES (:name, :age)”;
[/as]
Si pueden ver los valores de los campos están precedidos de dos puntos : esto significa que son parámetros de la sentencia.
La clase SQLStatement tiene una propiedad llamada parameters que es un Array en donde se tiene que asignar el valor de cada parámetro escrito en nuestra sentencia, en este ejemplo tenemos 2 parámetros :name y :age entonces necesitamos asignarle valores esto se hace con estas líneas
[as]
insertManager.parameters[":name"] = “Tmeister”;
insertManager.parameters[":age"] = “29″;
[/as]
En realidad es algo simple. no?
Obteniendo datos de la base de datos
Para obtener datos de la base de datos es exactamente lo mismo que hicimos para crear la tabla, solamente cambia la sentencia SQL
[as]
import flash.events.SQLErrorEvent;
import flash.events.SQLEvent;
import flash.data.SQLStatement;
private const TABLE_NAME:String = “people”
//Creamos una instancia de la clase
var query:SQLStatement = new SQLStatement();
//Asignamos la conexion a la base de datos
query.sqlConnection = conn
//Asignamos listeners a los eventos
query.addEventListener(SQLErrorEvent.ERROR, sqlError);
query.addEventListener(SQLEvent.RESULT, sqlResult);
//Sentencia a ejecutar
var sql:String = “SELECT * FROM ” + TABLE_NAME + ” order by id”;
//La sentencia SQL debe ser asignada a la propiedad text del SQLStatement
query.text = sql;
//Por ultimo ejecutamos la sentencia
query.execute();
private function sqlError(e:SQLErrorEvent)
{
trace(“Error: “+ e.error.message);
trace(“Detalles: “+ e.error.details);
}
private function sqlResult(e:SQLEvent)
{
var result:SQLResult = e.target.getResult();
for each ( var row:Object in result.data)
{
trace(row)
trace(row.id)
trace(row.name)
//etc
}
}
[/as]
Para obtener el resultado de la consulta de debemos ejecutar la función getResult de la instancia SQLStatement.
[as]
var result:SQLResult = e.target.getResult();
[/as]
Por último solo queda recorrer los resultados, que son devueltos como objetos
[as]
for each ( var row:Object in result.data)
{
trace(row)
trace(row.id)
trace(row.name)
//etc
}
[/as]
Con esto ya podemos comenzar a trabajar con SQLite para manejar información en la maquina local del usuario final.
Archivos para descarga
Rendering of template dTemplate.php failed |
Rendering of template dTemplate.php failed |
