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
[drain file 1 show dTemplate] | [drain file 2 show dTemplate] |
Fantástico Tmeister, un tutorial completísimo!
Hace sólo un par de meses que estoy tocando AIR y me encanta. Llevar Flash al escritorio pero añadiéndole características tan potentes como el acceso a SQLite es una gozada. Espero poder mostrar pronto las cosas que estoy haciendo 🙂
Y una pregunta respecto a Apollo-Code, ¿piensas darle continuidad? El proyecto es genial, sólo que quizá te adelantaste demasiado xD, pero la comunidad hispanoparlante va a necesitar iniciativas como esa.
Que tal Dani.
Aun no se qué hacer con apollo-code, en definitiva no será un blog, no veo caso estar manteniendo 2 blog sobre casi la misma temática, bien puedo postear en klr20mg cosas relacionadas sobre AIR como lo he venido haciendo.
He pensado mas en un sitio más complejo foros, tutoriales, repositorio de aplicaciones. Pero aun no estoy seguro que hacer pero ya lo resolveré. 😛
Saludos!!
Perfeito!!! Genial!!!
CAra estou a dias procurando algo sobre SQLite, que fosse claro. E vocíª me fez encontrar. E o primeiro tutorial de toda net que disponibiliza um tutorial tí£o claro.
Otimo! já guardei sua pagina nos meus favoritos. Continue com os tutoriais!!!
Buen tutorial, me agrada que actionscript siga extendiendose, aunque a los opositores les duela…
Tmeister, se que AIR es para hacer aplicaciones de escritorio, por lo tanto para poner aplicaciones como esta en un web hosting ya no requerirá AIR… mi pregunta es: ¿AS3 aun sin AIR puede interactuar con SQLite directamente si la aplicacion estubiera alojada en un web hosting, o necesitaria un intermedario como php (por ejemplo) como lo necesitaba en AS2?
Gracias
Gracias por toda esta información, pero me gustará que hiciera vídeotutoriales, ya que llegarán los conocimientos, a mas personas, me refiero a la pedagogá que ofrecen los productos audiovisuales.
Perdón si sueno exigente ( no es mi intención es mi emoción ), pero se necesita tanto de estos conocimientos.
Muchas Gracias por su labor, cuando afiance mis conocimientos en estas tecnologás estaré para ayudar en lo que sea necesario.
¿Y si el usuario no tiene instalado SQLite?
@David,
No, el usuario no tiene que tener instalado SQLite, solo el Runtime de AIR
Saludos!!
No se puede descargar los archivos del tuto 🙁
saludos nuevamente, ya pude descargar los archivos, pero lo hice desde IE por que firefox 2, no me lo permitia
Hola a tod@s, necesito ayuda urgente… jejeje, ya sé que no nos conocemos pero tiempo al tiempo!! No sé si es el sitio más adecuado para plantearla, pero tengo una aplicación de escritorio hecha en flash, que lee de varios xml los datos de artículos, clientes,… la aplicación nos permite realizar pedidos y enviarlos on-line, pero ahora querá hacer una funcionalidad nueva que me permita almacenar los pedidos en un archivo, txt o xml en este equipo, no tengo ni idea como hacerlo en flash, sin utilizar php o asp, podrás echarme un cable bien grandeee????
Un Saludo y gracias de antemano.
Silvia
Hola.
Usas AIR, o algo similar para crear tu aplicacion o solo es un SWF normal??
Saludos!!
Lo que tengo es un swf normal, la funcionalidad que quiero añadir es que almacene en un .txt o .xml en local el pedido que realaiza, por si en ese momento la aplicación no tiene conexión, y así pueda ir almacenando los pedidos y llegado un momento en el que tenga conexión enviarlos vá web, ahí recuperará la información del documentos y se enviará, de la misma forma que hace actualemnete… no sé si me explico, es para que la aplicación nos permita trabajar offline.
Gracias por tu ayuda.
Silvia