Esta es la primera parte del proyecto “Sistema de Clientes” desarrollado en AIR con SQLite como administrador de base de datos. Para este proyecto usaremos Flex Builder 3, del cual puedes bajarte una versión de prueba del Flex Builder 3 aquí. Si requieres más información sobre qué es AIR y qué puedes hacer con él visita esta entrada. Los archivos de este proyecto los encontrarás al terminar de publicar todas las partes (entradas) de este proyecto.
Para este proyecto, abre Flex Builder 3 y crea un nuevo proyecto de AIR (File -> New -> Flex Project. Como nombre de proyecto (Project name) ponle Sistema_Clientes; en la sección de Application type selecciona la opción Desktop application (runs in Adobe AIR) y haz click en el botón Finish.
Como lo comenté en la sección de Proyectos, aquí mostraré solamente la información más importante y sobre la cual trata el tema, sin embargo el archivo fuente del proyecto está completo y tiene integrado todo lo que se mostrará en esta entrada y en las siguientes, para así formar un proyecto completo. Dicho lo anterior, a continuación iniciaré la explicación sobre cómo crear una base de datos en SQLite.
Parte 1: Crear Base de Datos en SQLite con AIR
Para mantener organizado el código de nuestro proyecto y para evitar que se pierdan con toda la información aquí mostrada, vamos a dividir el código del proyecto en archivos .as. Estos archivos estarán almacenados en la carpeta actionscript. La estructura de nuestro proyecto será la siguiente:
Comenzamos con el archivo CrearBaseDatos.as:
Necesitamos de las siguientes librerías para poder tener acceso a los métodos de conexión con la base de datos, la ejecución de los queries, etc. Las clases que usaremos son SQLConnection, SQLErrorEvent y SQL Event:
import flash.data.SQLConnection; import flash.events.SQLErrorEvent; import flash.events.SQLEvent; import mx.controls.Alert; /* Haremos uso de los mensajes de alerta, por lo que de una vez añadimos la clase */
Ahora vamos a crear los objetos de estas clases y las variables que requeriremos a lo largo de este archivo:
private var conexion:SQLConnection; // Nuestro objeto de la clase SQLConnection private var database:File; /* Aquí guardaremos la referencia de nuestro archivo .sqlite que es nuestra base de datos */ private var existeBD:Boolean = false; /* Variable booleana en la cual guardaremos el valor de true si existe la base de datos y false en caso contrario */ private var queryStatement:SQLStatement = new SQLStatement(); /* Creamos una variable de tipo SQLStatement en la cual estableceremos los queries y parámetros de nuestras consultas */
Para crear las sentencias de SQL, necesitamos de un objeto de la clase SQLStatement, a este objeto lo llamamos queryStatement.
La función abreConexion (que mostraremos a continuación) será llamada desde la aplicación principal, es decir desde el archivo Sistema_Clientes.mxml (recuerda que al crear un nuevo proyecto, Flex Builder construye automáticamente un archivo MXML con el nombre del proyecto y el cual es el punto de partida de nuestra aplicación). Esta función se encargará de verificar si existe la base de datos la cual la pasamos como parámetro del constructor de la clase File. Si no existiera la base de datos la aplicación se encargará de crearla. En caso contrario, se establecería la conexión con la base de datos. El nombre de nuestra base de datos será clientesDB.sqlite, presta atención a la primera línea de nuestra función:
private function abreConexion():void {
/* Asignamos a nuestra variable database el archivo de nuestra base de datos */
database = new File(File.applicationStorageDirectory.nativePath + "\database\clientesDB.sqlite");
/* Inicializamos nuestra variable conexion */
conexion = new SQLConnection();
/* Creamos el listener que será llamado cuando se abra la conexión a la base de datos */
conexion.addEventListener(SQLEvent.OPEN, dbAbrirConexion);
/* Creamos el listener que será llamado cuando exista algún error en la conexión a la bd */
conexion.addEventListener(SQLErrorEvent.ERROR, dbErrorConexion);
queryStatement.sqlConnection = conexion; /* Le asignamos a su propiedad sqlConnection la variable conexion que creamos al inicio del archivo */
if(!database.exists) { // Comprobamos si existe o no la base de datos
existeBD = false; // No existe la bd, por lo tanto le asignamos a existeBD el valor de falso
conexion.open(database); // Abrimos la conexión a la bd
}
else {
conexion.open(database); // Abrimos la conexión a la bd
}
}
Observa que al constructor de la clase File le estamos pasando como parámetro el URL de donde estará almacenada nuestra base de datos. Para construir este URL estamos usando la propiedad applicationStorageDirectory, la cual hace referencia al directorio privado donde se encuentra la aplicación. Además, estamos usando la propiedad nativePath la cual nos regresa la ruta completa de acuerdo al sistema operativo donde se encuentra el sistema. A grandes rasgos, esta línea crea un directorio con el nombre de la aplicación (en este caso el directorio se llama Sistema_Clientes) dentro de la carpeta de Application Data (Datos de programa). Esta carpeta es donde los programas que tenemos instalados guardan información o las preferencias del usuario de la computadora. En Windows Vista, el directorio donde está almacenada la base de datos es C:\Users\Nombre_Usuario\AppData\Roaming\Sistema_Clientes. En Windows XP, el directorio es: C:\Documents and Settings\Nombre_Usuario\Datos de programa\Sistema_Clientes.
Al hacer la llamada a la función open, la función dbAbrirConexion será llamada en caso de que no exista error; en caso contrario la función dbErrorConexion será llamada. El código de estas funciones se muestra a continuación:
private function dbAbrirConexion(event:SQLEvent):void {
if(!existeBD) { /* Si no existe la base de datos, llamamos a la función createTBLCliente */
createTBLCliente();
}
}
private function dbErrorConexion():void {
Alert.show("No se pudo conectar a la base de datos"); /* Mostramos un mensaje de error*/
}
Nuestra base de datos estará conformada por solamente una tabla (sólo para fines del ejercicio, ya que no es común que una base de datos esté formada por sólo una tabla). Nuestra tabla se llama cliente y sus elementos son los siguientes:
De la imagen anterior podemos determinar que el query para crear esta tabla es:
CREATE TABLE `cliente` (`id` INTEGER PRIMARY KEY NOT NULL, `nombre` TEXT, `direccion` TEXT, `telefono` TEXT, `email` TEXT)
Este query lo usaremos en la función createTBLCliente, el cual es llamado desde dbAbrirConexion.
private function createTBLCliente():void {
queryStatement.clearParameters();
var sql:String = "CREATE TABLE `cliente` ";
sql += "(`id` INTEGER PRIMARY KEY NOT NULL, `nombre` TEXT, `direccion` TEXT ";
sql += ", `telefono` TEXT, `email` TEXT)";
queryStatement.text = sql;
try {
queryStatement.execute();
insertDefaultData();
}
catch(error:SQLError) {
Alert.show("Error al insertar el registro: " + error.toString());
}
}
Para crear las sentencias de SQL, necesitamos de un objeto de la clase SQLStatement, a este objeto lo llamamos queryStatement y lo declaramos al inicio del programa. Para asegurarnos de que no tengamos parámetros asignados a este SQLStatement, usamos la función clearParameters, de no hacer esto el programa generará un error indicándonos que la cantidad de parámetros establecidos en el query no concuerda con los parámetros del SQLStatement. Posteriormente declaramos una variable sql de tipo String que contiene el query de crear la tabla de cliente.
La propiedad text de la clase SQLStatement nos permite asignarle la sentencia SQL, por lo que le asignamos la variable sql.
Para poder “cachar” cualquier error que ocurra al ejecutar la sentencia, colocamos la llamada a la función execute dentro del bloque try. Cualquier error que ocurra será detectado y administrador en el bloque catch. En caso de que no exista ningún error al llamar a la función execute, llamaremos a la función insertDefaultData para insertar algunos registros por default.
A continuación pego el código de la función insertDefaultData:
private function insertDefaultData():void {
queryStatement.clearParameters();
var sql:String = "INSERT INTO `cliente` (nombre, direccion, telefono, email) VALUES (:nombre, :direccion, :telefono, :email)";
queryStatement.parameters[":nombre"] = 'Ernesto Trujillo';
queryStatement.parameters[":direccion"] = 'Avenida Importante #33';
queryStatement.parameters[":telefono"] = '55667788';
queryStatement.parameters[":email"] = 'etrujillo@email.com';
queryStatement.text = sql;
try {
queryStatement.execute();
}
catch(error:SQLError) {
Alert.show("Error al crear la tabla cliente: " + error.toString());
}
}
Este código es similar al de la función createTBLCliente en cuanto a la creación de la variable del SQLStatement, la creación del query y su asignación a la propiedad text. Sin embargo, presta atención en la forma en cómo se le pasan los valores al query; esto es usando dos puntos seguidos de un nombre cualquiera que quieras asignarle. Posteriormente debes establecer el valor de estos parámetros usando la propiedad parameters la cual recibe un arreglo asociativo con los valores del parámetro especificado.
Como recomendación y para que te asegures de que tu base de datos, la tabla y el registro fueron creados, puedes bajar el complemento para Firefox llamado SQLite Manager, el cual es un pequeño y simple administrador de bases SQLite.





Hola Carla, queria hacerte una consulta, se que me puedes ayudar. tengo que desarrollar una aplicacion que consiste en registro de usuario en con Flex 4 pero para descktop, o sea ocupar AIR. Recién me estoy iniciando en esto, pero lo complejo es que tengo que registrar al usuario con ingresando su huella digital con una lector de huella digital SecuGen Hamster IV, Hay un ejemplo Html que trae un JavaScript el cual hace lo básico Registra, Captura y despues verifica y va almacenando sin una Base de Datos si no en una variable.Mi pregunta es la siguiente ¿como inserto el JavaScript en mi aplicación AIR?. Posteriormente Yo quiero ocupar SQLite para almacenar los datos.
Ahora por que acudo a tí, por que viendo varios post tu eres quien se maneja muy bién en el tema, y como me estoy iniciando en flex me has servido en respuestas anteriores de forma clara.
Hola , excelente tutorial, todo funciona a la perfeccion me gustaria saber como poder manejar el programa en vez de usar un menu , botones que aparescan en el inicio de carga del programa y que el datagrid de eliminar y agregar clientes se carge en el inicio tambien , por cualquier ayuda muchas gracias.
Logre solucionar mi problema. Ahora otro: ¿como hago el deployment para mi usuario final?
Saludos
Saludos.
Estoy trabajando con una aplicacion parecida. Mi problema es el siguiente:
Puedo conectarme a la base hecha con la version sqlite 3.2, tengo un manejador externo para modificar mi diseño. Puedo conectarme a la base, pero al momento de buscar registros, tengo el mensaje de que no encuentra la tabla. He probado de varias maneras: con el nombre de la tabla en minisculas, mayusculas y hasta combinado pero hasta el momento no puedo recoger datos. Por otro lado, la base esta en la misma carpeta que los fuentes.
Un saludo
Hola Alejandro,
Es posible que sea por algún cambio en la versión del Flex Builder o algo por estilo.
¿No marca ningún error? ¿No muestra ni el menú ni las formas?
Saludos.
Hola gracias por el ejemplo.
Disculpe, baje el archivo .zip y lo exporte a mi estacio de trabajo de flex, ejecuto la aplicación pero no hace nada. les agradeceré y me puedan ayudar. Quiero aprender
Hola, yo tengo el problema de que baje el arhivo zip del proyecto y lo importe como lo explicas en los primeros post pero al momento de darle run flex no hace nada, sabes porque sucede esto?
Es posible conectar con una bd Access, lo he intentado sin exito modificando esta línea de CrearBaseDatos.as
private function abreConexion():void {
//database = new
database = new File(“clientesDB.mdb”);
La bd está dentro del directorio src.
Gracias y un saludo.
Javier
que es lo que debo de hacer para crear una base de datos para el ingreso de remiciones
excelente todos estos tutoriales, gracias¡¡¡¡¡¡
Hola Sofía,
En ninguna parte del tutorial se habla sobre enviar mails masivos a los clientes; simplemente es un sistema administrador de información sobre clientes.
Podrías utilizar PHP para enviar tus mails, para eso puedes utilizar la clase PHPMailer o bien revisar el post “Enviar Formulario de Contacto” con Flash y PHP (prestándole atención solamente al código PHP).
Importante: El envío de tus correos dependerá de la configuración de tu ISP o bien del servidor donde corras la aplicación. Además, el uso de estas tecnologías no te exime de que tus correos sean considerados como spam.
Saludos.
Hola, me gustaria saber si con este programa se puede enviar mails masivos a todos los clientes, debido a que hice la base de datos en el Outlook pero ya tengo mas de 3000 clientes y tarda aprox 2 dias en mandar un mail. En caso que no se pueda, existe algun programa que lo permita, y además me avise cuando son los cumpleaños de los clientes??? Muchas gracias y espero algun respuesta. Saludos
Dale buenisimo Carla, sos un fenomeno. Espero a que lo publiques, y si me lo podes mandar mejor asi lo voy mirando porque seguro algo no voy a entender. Muchas gracias
Saludos!
Hola Federico,
Como ya tienes conocimientos de AMFPHP con Flash yo creo que te será más fácil lo que veamos en el siguiente tutorial.
En ese nuevo tutorial usaremos varias tablas (a diferencia de éste en el cual solamente tenemos la tabla de clientes), pero la sección de servicios o la de divisas te servirían mucho para tu sistema.
Espero poder publicarlo mañana, si no pudiera te propongo enviarte el archivo de ese tutorial a tu correo.
Saludos.
Ahh, gracias . De AMFPHP algo manejo pero con Flash. Es mas lo que estaba intentando hacer lo estaba intentando hacer con eso pero me trabe en una parte y decidi cambiar de porgrama y cai aca.
Lo que queria hacer es que tengo 3000 clientes con nombre, empresa, etc,etc y poder buscar uno, editar, borrar e ingresar uno nuevo. Todo esto que este en una base de datos unica ya que acceden diariamente varias personas de difrentes lugares fisicos.
Esto lo habia empezado a hacer con Flash y AMFPHP y SQL, logre bastante pero me trabe y nose si esto servira para eso.
pd: Ya se arreglaron los links, me funsiono mal a mi una ves nose que paso
Muchos Saludos
gracias