Comunidad de diseño web y desarrollo en internet online

Air - Clase en ActionScript 3 para manejar bases SQLite.

Hola como estan??

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 aplicación conocida y destruir a hacerle competencia a Silverlight jaja (bromilla).. (o no.. :roll: )

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:

Código :

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


Segundo, creamos las tablas:

Código :

//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

Código :

//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

Código :

//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 método setSelect(); utiliza 3 parámetros.

  • 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 algún error.

Terminaria devolviendo un query asi:
SELECT * FROM tareas ORDER BY id DESC

Para hacer una consulta mas rigurosa:

Código :

//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".
Terminaría devolviendo un query asi:
SELECT * FROM tareas WHERE titulo ='Registro' ORDER BY id DESC

Quinto, haciendo una modificación:

Código :

//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 métodos y a medida que voy mejorándola la voy subiendo aca y en http://www.phoxer.com/es/blog/post_41/ :)

haaa me olvidaba, acá esta la la clase AirSqlManager:

Código :

/**
Air SQLite Manager
By ::[PHOXER]::
http://www.phoxer.com
v 1.1;
*/
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=cmp.substring(0,cmp.length-1);
      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();
         //var result:SQLResult=State.getResult();
         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=campos.substring(0,campos.length-1);
      valores=valores.substring(0,valores.length-1);
      sql+=campos+") VALUES ("+valores+")";
      trace(sql);
      State.text=sql;
      try{
         State.execute();
         //var result:SQLResult=State.getResult();
         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=sets.substring(0,sets.length-1);
      sql+=sets+" WHERE "+campo+"='"+valor+"'";
 
      trace(sql);
      State.text=sql;
      try{
         State.execute();
         //var result:SQLResult=State.getResult();
         if(bk!=null){
            bk();
         }
      }catch (e:SQLError){
         trace("INSERT ERROR: "+e);
         if(err!=null){
            err();
         }
      }
   }
}


Espero que entre todos la mejoremos aportando ideas..
Saludos, phoxer.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate