Clase para manejar SQLite en Air - ActionScript3 | Phoxer.com
Clase para manejar SQLite en Air - ActionScript3
25/03/2009

Voy compartir una clase que desarrollé que podría ser muy útil para todos los que trabajan con Air y SQLite (base local) o quieran hacerlo, ya que entre todos tenemos que hacer a esta maravillosa aplicacion conocida y destruir a Silverlight jaja (bromilla).. (o no..)

He estado rompiéndome la cabeza un poco para pasar los métodos que tengo de conexión de PHP a ActionScript 3, para poder manejar registros simples, como UPDATE, INSERT y SELECT desde una sola clase y lo he conseguido!!.

Voy a tratar de ser breve..
Desde ActionScript 3 la implementación es muuuuy simple.. en este caso trabajo desde Flex 3, vamos por pasos.

Primero, importamos la clase y hacemos la conexión, la clase automáticamente creará la base de datos si no existe:

import phoxer.DataManager.AirSqlManager;
 
private var database:AirSqlManager;
private function onComplete():void{
	database = new AirSqlManager("test.db");
}


Segundo, creamos las tablas:

//CREAR LA TABLA
var campos:Object= new Object();
campos.id="INTEGER PRIMARY KEY  NOT NULL";
campos.titulo="TEXT";
campos.fecha="TEXT";
 
var tableTareasToCreate:Object= new Object();
tableTareasToCreate.tabla="tareas";
tableTareasToCreate.campos=campos;
database.createTable(tableTareasToCreate,insertTarea);
 

El metodo createTable(); utiliza 3 parametros.
1-El objeto con la información para crear la tabla.
2-La función a la que llama si se pudo crear la tabla o si ya existe.
3-La función a la que llama si se genero algun error en la creación de la tabla.

Terminaria devolviendo un query asi:
CREATE TABLE IF NOT EXISTS tareas (`titulo` TEXT,`id` INTEGER PRIMARY KEY NOT NULL,`fecha` TEXT)

Tercero, Incertando un registro

//INSERTAR REGISTRO
var campos:Object= new Object();
campos.titulo="Registro 1";
campos.fecha="20/08/2009";
 
var dataToInsert:Object = new Object();
dataToInsert.tabla="tareas";
dataToInsert.datos=campos;
database.setInsert(dataToInsert,consultar);

el metodo setInsert(); utiliza 3 parametros.
1-El objeto con la información para hacer el insert.
2-La función a la que llama si se pudo hacer. (todabía no se como recuperar el ultimo id)
3-La función a la que llama si se genero algun error.
Terminaria devolviendo un query asi:
INSERT INTO tareas (titulo,fecha) VALUES ('Registro 1','20/08/2009')

Cuarto, haciendo una consulta

//HACER UNA CONSULTA
var tableToConsult:Object= new Object();
tableToConsult.tabla="tareas";
tableToConsult.principal="id";
tableToConsult.orden="DESC";
database.setSelect(tableToConsult,leerDatos,onError);
 
 
private function leerDatos(dts:Array):void{
	for each(var dt:Object in dts){
		trace(dt.id+" "+dt.titulo+" "+dt.fecha);
	}
}
 
private function onError():void{
	trace("no se pudo hacer la consulta");
}
 

el metodo setSelect(); utiliza 3 parametros.
1-El objeto con la información para hacer la consulta.
2-La función a la que llama si se pudo hacer. devuelve un array de objetos con el resultado
3-La función a la que llama si se genero algun error.
Terminaria devolviendo un query asi:
SELECT * FROM tareas ORDER BY id DESC

Para hacer una consulta mas rigurosa:

//HACER UNA CONSULTA
var tableToConsult:Object= new Object();
tableToConsult.tabla="tareas";
tableToConsult.principal="id";
tableToConsult.orden="DESC";
tableToConsult.filtro="titulo";
tableToConsult.same="Registro";
database.setSelect(tableToConsult,leerDatos,onError);
 
 
private function leerDatos(dts:Array):void{
	for each(var dt:Object in dts){
		trace(dt.id+" "+dt.titulo+" "+dt.fecha);
	}
}
 
private function onError():void{
	trace("no se pudo hacer la consulta");
}
 

Si ven se agregaron dos opciones mas "filtro y same", esto nos va a devolver los registros cuando ejemplo: "titulo" sea igual a "Registro".
Terminaria devolviendo un query asi:
SELECT * FROM tareas WHERE titulo ='Registro' ORDER BY id DESC

Quinto, haciendo una modificación:

//MODIFICAR UN REGISTRO
var datos:Object=new Object();
datos.titulo="Modificado";
datos.fecha="1/09/2009";
 
var registroAModificar:Object = new Object();
registroAModificar.tabla="tareas";
registroAModificar.datos=datos;
registroAModificar.campo="id";
registroAModificar.valor="3";
database.setUpdate(registroAModificar);

el metodo setUpdate(); utiliza 3 parametros.
1-El objeto con la información del registro que se va a modificar.
2-La función a la que llama si se pudo hacer.
3-La función a la que llama si se genero algun error.
Terminaria devolviendo un query asi:
UPDATE `tareas` SET `titulo`='Modificado',`fecha`='1/09/2009' WHERE id='3'

Bien como vemos con esta clase se nos resulta muyyy facil conectarnos a una base de datos SQLite y manejarla, que les parece??..
Me faltan mas metodos a medida que voy mejorandola la voy subiendo.

Aca esta la la clase AirSqlManager:

/**
Air SQLite Manager
By ::[PHOXER]::
http://www.phoxer.com
v 1.2;
*/
package phoxer.DataManager{
	import flash.data.SQLConnection;
	import flash.data.SQLResult;
	import flash.data.SQLStatement;
	import flash.errors.SQLError;
	import flash.events.SQLErrorEvent;
	import flash.events.SQLEvent;
	import flash.filesystem.File;
 
	public class AirSqlManager{
	private var conexion:SQLConnection;
	private var BDFile:File;
	private var State:SQLStatement = new SQLStatement();
	public function AirSqlManager(db:String,asy:Boolean=false){
		conexion = new SQLConnection();
		conexion.addEventListener(SQLEvent.OPEN,onDbOpen,false,0,true);
		conexion.addEventListener(SQLErrorEvent.ERROR,onDbError,false,0,true);
		BDFile=File.applicationStorageDirectory.resolvePath(db);
		trace("DB PATH: "+BDFile.nativePath)//path actual.
		trace("DB EXIST: "+BDFile.exists)//si existe la base.
		if(asy){
			conexion.openAsync(BDFile);
		}else{
			conexion.open(BDFile);
		}
	}
	private function onDbOpen(e:SQLEvent):void{
		trace("DB CONECTED")
		State.sqlConnection = conexion;
	}
	private function onDbError(e:SQLErrorEvent):void{
		trace("DB Error: SqlData: "+e)
	}
 
	public function createTable(Obj:Object,bk:Function=null,err:Function=null):void{
		var campos:Object=Obj.campos;
		var sql:String="CREATE TABLE IF NOT EXISTS "+Obj.tabla+" (";
		var cmp:String="";
		for(var dt:Object in campos){
			cmp+="`"+dt+"` "+campos[dt]+",";
		}
 
		cmp=quitarUltimaComa(cmp);
		sql+=cmp+")";
		trace(sql);
		State.text=sql;
		try{
			State.execute();
			if(bk!=null){
				bk();
			}
		}catch (e:SQLError){
			trace("CREATE ERROR: "+e);
			if(err!=null){
				err();
			}
		}
 
	}
 
	public function setSelect(Obj:Object,bk:Function=null,err:Function=null):void{
		var tabla:String=Obj.tabla;
		var principal:String=Obj.principal;
		var orden:String=Obj.orden;
		var filtro:String=Obj.filtro;
		var same:String=Obj.same;
		var like:String=Obj.like;
		var limite:String=Obj.limit;
		var select:String=Obj.select;
		//-limit
		limite=(limite!="" && limite!=null)? String(" LIMIT "+limite):"";
		//-Select
		select=(select!="" && select!=null)? String("`"+select+"`"):"*";
		//-SQL
		var sql:String;
		if(filtro!="" && filtro!=null && same!="" && same!=null) {
				sql="SELECT "+select+" FROM "+tabla+" WHERE "+filtro+" ='"+same+"' ORDER BY "+principal+" "+orden+" "+limite;
		}else if(filtro!="" && filtro!=null && like!="" && like!=null){
				sql="SELECT "+select+" FROM "+tabla+" WHERE "+filtro+" LIKE '%"+like+"%' ORDER BY "+principal+" "+orden+" "+limite;
		}else{
				sql="SELECT "+select+" FROM "+tabla+" ORDER BY "+principal+" "+orden+" "+limite;
		}
		trace(sql);
		State.text=sql;
		try{
			State.execute();
			if(bk!=null){
				var result:SQLResult = State.getResult();
				bk(result.data);
			}
		}catch (e:SQLError){
			trace("SELECT ERROR: "+e);
			if(err!=null){
				err();
			}
		}
	}
 
	public function setInsert(Obj:Object,bk:Function=null,err:Function=null):void{
		var datos:Object=Obj.datos;
		var sql:String="INSERT INTO "+Obj.tabla+" (";
		var campos:String="";
		var valores:String="";
		for(var dt:Object in datos){
			campos+=dt+",";
			valores+="'"+String(datos[dt])+"',";
		}
		campos=quitarUltimaComa(campos);
		valores=quitarUltimaComa(valores);
		sql+=campos+") VALUES ("+valores+")";
		trace(sql);
		State.text=sql;
		try{
			State.execute();
			if(bk!=null){
				bk();
			}
		}catch (e:SQLError){
			trace("INSERT ERROR: "+e);
			if(err!=null){
				err();
			}
		}
	}
 
	public function setUpdate(Obj:Object,bk:Function=null,err:Function=null):void{
		var tabla:String=Obj.tabla;
		var datos:Object=Obj.datos;
		var campo:String=Obj.campo;
		var valor:String=Obj.valor;
		var sql:String="UPDATE `"+tabla+"` SET "
		var sets:String="";
		for (var dt:Object in datos){
			sets+= "`"+dt+"`='"+String(datos[dt])+"',";
		}
		sets=quitarUltimaComa(sets);
		sql+=sets+" WHERE "+campo+"='"+valor+"'";
 
		trace(sql);
		State.text=sql;
		try{
			State.execute();
			if(bk!=null){
				bk();
			}
		}catch (e:SQLError){
			trace("INSERT ERROR: "+e);
			if(err!=null){
				err();
			}
		}
	}
 
	public function setDelete(Obj:Object,bk:Function=null,err:Function=null):void{
		var sql:String="DELETE FROM "+Obj.tabla+" WHERE "+Obj.campo+"='"+Obj.valor+"'";
		trace(sql);
		State.text=sql;
		try{
			State.execute();
			if(bk!=null){
				bk();
			}
		}catch (e:SQLError){
			trace("DELETE ERROR: "+e);
			if(err!=null){
				err();
			}
		}
	}
 
	private function quitarUltimaComa(st:String):String{
		return st.substr(0,-1);
	}
}