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); } }
