SGBD SQLITE 1 Documentación SQLite ÍNDICE 1. Introducción............................................................................................................................. 2 2. Características Generales de SQLite ................................................................................ 2 3. Arquitectura de SQLite ......................................................................................................... 3 4. Instalación y Configuración ................................................................................................ 5 5. Bases de Datos y Tipos de Datos en SQLite ................................................................ 12 6. Operaciones básicas en SQLite ....................................................................................... 13 7. SQLite en Aplicaciones Java ............................................................................................ 20 SGBD SQLITE 2 1. Introducción SQLite es un sistema gestor de base de datos que se encuentra implementado como una librería o un proceso, autocontenido, sin configuración y transaccional. Es Open Source y es de carácter embebido, con lo cual se la utiliza en muchas aplicaciones donde se quiera tener una base de datos pero embebida en la propia aplicación evitando su instalación y configuración como un servidor aparte. El SGBD es un proceso denominado sqlite, el cual construye y mantiene bases de datos en archivos de extensión .db y ofrece todas las funciones estándar de SQL. Permite efectuar operaciones de lectura y escritura sobre dichos ficheros al interactuar con la base de datos. Entre las características que posee se cuentan con el manejo de tablas, índices, triggers1 y vistas, entre otros. Funciona tanto en sistemas de 32 y 64 bits. 2. Características Generales de SQLite SQLite se implementa como una librería compacta, integrada por ficheros escritos en el lenguaje C o sino como un fichero ejecutable de Windows cuyo tamaño es de aproximadamente de 350 KB, dependiendo de la plataforma. El mismo funciona relativamente rápido en el sistema, ya que no utiliza archivos de paginación elevados como sucede en el caso de los motores de base de datos propietarios u open Source que poseen un servidor y un cliente, como ser Microsoft SQL Server, IBM DB2, MySQL, Oracle, PostgresSQL, etc. Esta característica hace que SQLite sea utilizada en una gran variedad de aplicaciones, como ser procesadores de texto, navegadores web, aplicaciones para dispositivos móviles, PDAs, aplicaciones en general, etc., para efectuar el almacenamiento de información sobre tablas relacionales con las ventajas que ello posee por sobre el manejo de archivos. SQLite ha sido testeado cuidadosamente en sus distintas versiones, posee un buen manejo de memoria en caso de fallos y errores de entrada/salida de disco. Las transacciones cumplen con la propiedad ACID (Atomicidad, Consistencia, Integridad y Aislamiento). Resumiendo, se puede decir que las principales características de SQLite son: 1 Cumplimiento con el estándar ACID. No requiere instalación ni configuración para poder ser utilizada. Implementa el estándar SQL’92. Se trata de una base de datos completa contenida en un fichero. Soporta grandes bases de datos y también datos de tipo BLOB. Trigger: es un procedimiento que se ejecuta en el SGBD cuando se cumple con determinada condición definida para el mismo. SGBD SQLITE 3 Su código fuente de implementación es de tamaño reducido. Es muy rápida al efectuar operaciones de tipo cliente-servidor. Esta escrita en el lenguaje C y algunos componentes en TCL2. Su código fuente ha sido 100% testeado pasando exitosamente el mismo. Su código fuente se encuentra disponible para toda la comunidad de desarrolladores. Es auto contenido, lo cual significa que no requiere dependencias externas. Soporta las plataformas UNIX, WINDOWS y OS/2. Provee una herramienta de línea de comandos para la gestión del motor, como así también existen herramientas de interface gráfica que pueden utilizarse para realizar las operaciones. Los usos sugeridos para SQLite son: Para mapear formatos de archivo de la aplicación como ser archivos XML y demás. Bases de datos para dispositivos celulares, MP3, y demás componentes electrónicos. Bases de datos para sitios web por su tamaño reducido. Bases de datos para aplicaciones empresariales. Algunas de las aplicaciones conocidas a nivel mundial que utilizan este SGBD: Adobe Skype Google Mc Afee Symbian Etc. Las limitaciones que posee básicamente son tres: Posee limitación en el uso de consultas anidadas en la cláusula WHERE. Se hace caso omiso de las claves foráneas. Falta de documentación en español. Sin embargo, por sus ventajas la hace apropiada a una gran variedad de aplicaciones para el usuario. 3. Arquitectura de SQLite A continuación se presenta el diagrama de bloques de la arquitectura de SQLite: 2 TCL: es un lenguaje de programación dinámico e interpretado. Forma parte del TCL/ TK. 4 SGBD SQLITE En donde se puede ver básicamente los grandes bloques que componen a su arquitectura: El Núcleo (Core) del sistema gestor de base de datos: Interface: la interface provista por SQLite se encuentra implementada mediante funciones en los archivos de código fuente main.c, legacy.c y vbdeapic, los cuales posee rutinas en general que hacen a las funciones básicas. Entre las funciones más utilizadas se tiene sqlite3_get_table() y sqlite3_complete(). La interface TCL se encuentra implementada en el fichero tclsqlite.c. Todos los comandos en sqlite son precedidos por el prefijo sqlite3, para evitar problemas con cualquier otro sistema gestor de base de datos. Procesador de comandos de SQL: se trata del componente central cuya función es la de recibir comandos SQL y transformarlos al formato requerido para que el compilador pueda manejarlos, como así también la máquina virtual. Máquina Virtual: el programa que se genera en el Generador de Código del compilador SQL es ejecutado por la máquina virtual. La misma implementa una máquina abstracta que permite manipular las bases de datos que están almacenadas en los archivos. Tiene una pila para uso inmediato. Los archivos asociados son vdbe.c, vdbe.h y vdbeInt.h. Las funciones que implementa utilizan llamadas a rutinas en el lenguaje C. Para cada grupo de funciones se tiene el fichero en el lenguaje C que las implementa. SGBD SQLITE 5 El compilador SQL: Tokenizer: cuando se ejecutan las sentencias SQL, el tokenizer recibe el string y lo que hace es dividirla en tokens y pasarlos uno por uno al Parseador. Este componente se encuentra codificado en el fichero tokenize.c. En este diseño, el tokenizer llama al parseador. Parser: este componente le asigna un significado a cada tokens según el contexto. Se lo generó utilizando el generador de Parsers Lemon. Define el concepto de un destructor no terminal que maneja automáticamente la memoria. Generador de código: luego de que el parser ensamble los tokens dentro de sentencias SQL, éste llama al generador de código para que produzca código entendible por la máquina virtual que haga las funciones solicitadas en la sentencia SQL. Los archivos donde se encuentra todo ello son: attach.c, auth.c, build.c, delete.c, expr.c, insert.c, pragma.c, select.c, trigger.c, update.c, vacuum.c y where.c. En los mismos se encuentran codificadas las rutinas para realizar las operaciones SQL estándar. También existen otros ficheros con funciones asociadas. El Backend: B-Tree: la base de datos SQLite se mantiene en el disco bajo la implementación de un árbol-B contenido en el fichero de código fuente btree.c. Esto es, por cada tabla e índice en la base de datos se almacena un fichero en el disco. Caché de Páginas: el módulo B-Tree requiere información de los clusters del disco. El tamaño por defecto de los mismos es de 1024 bytes, pero puede variar entre 512 y 65536 bytes. El caché de páginas también provee la abstracción correspondiente de rollback y operaciones de commit de la base de datos sobre el fichero correspondiente a la misma, garantizando eficiencia y eficacia. Se implementa en las librerías pager.c y pager.h. Interface con el Sistema Operativo: SQLite utiliza una capa de abstracción para comunicarse con el sistema operativo. Se encuentra definida en el fichero os.h y cada sistema operativo tiene su implementación, como ser por ejemplo os_unix.c, os_win.c. Los componentes accesorios: Utilitarios: la alocación de memoria y comparación de strings tiene rutinas localizadas en el fichero util.c. Las tablas de símbolos se encuentran en el fichero hash.c entre otros. Código de Prueba: existen scripts que poseen código de prueba, con la extensión .c para efectuar pruebas diversas, como ser text1.c, md.5.c, os_test.c. 4. Instalación y Configuración Como se indicó dentro de las características del SGBD, el mismo se encuentra estructurado como una librería en C, pero también se puede disponer de un fichero ejecutable del mismo. Además, también se dijo que su instalación es muy simple, es decir 6 SGBD SQLITE que no requiere setup ni configuración alguna. En el sitio oficial se puede descargar gratuitamente el mismo, en http://www.sqlite.org/download.html se encuentran las opciones de descarga, donde tenemos: Los ficheros de código fuente. La documentación. Ficheros precompilados, en sus versiones para Linux, Mac y Windows. De todas las opciones, la más sencilla es descargar el fichero precompilado para Windows, sqlite-shell-win32-x86-3071100.zip, que se trata de un archivo .zip, lo descargaremos y lo descomprimiremos en un directorio del disco rígido y se tiene el sistema gestor listo para poder utilizarlo. 7 SGBD SQLITE El archivo sqlite3 es el correspondiente al sistema gestor de base de datos. Para poder utilizarlo existen básicamente tres opciones de uso: Desde la consola del sistema. Mediante la herramienta SQLite Manager. Mediante el navegador web Mozilla Firefox, para el cual existe una extensión que puede agregarse al mismo para su manejo. Para poder utilizarlo desde la consola CMD de Windows, se debe agregar una referencia a la variable Path del sistema, del fichero sqlite3 para que pueda ser utilizado directamente desde la misma. Eso se hace, en las variables de entorno del sistema: 8 SGBD SQLITE Y luego, desde la consola de Windows en CMD se puede utilizar el comando sqlite3 para acceder al motor de base de datos: Luego, se tiene la herramienta SQLite Manager, que es una herramienta Wizard que permite gestionar visualmente las bases de datos SQLite. La misma puede ser descargada gratuitamente sin problemas desde varios sitios web, existen versiones desktop de la herramienta y web también. En este caso se utiliza la versión desktop. Se la descarga, se trata de un fichero .RAR. Una vez efectuada su descarga, se la puede iniciar y posee todas las opciones para el manejo de bases de datos SQLite. 9 SGBD SQLITE En la figura anterior se puede visualizar las secciones del programa. El mismo, en su parte izquierda Schema presenta la opción de visualizar las bases de datos SQLite que se tengan abiertas. Cada base de datos se almacena en el directorio de instalación como un fichero con extensión .db, el cual almacena todos los elementos de la misma incluidos los datos. En la parte superior derecha se pueden escribir y ejecutar consultas SQL a la base de datos. En el menú principal se tienen las opciones de la herramienta, incluyendo: File – aquí se pueden acceder y manipular las bases de datos SQLite que se tengan. 10 SGBD SQLITE Context – ofrece la opción de actualizar el árbol de bases de datos. Database – acá se tienen opciones básicas para trabajar con la base de datos actual, como ser la creación de tablas, vistas, consultas, importar datos, esquemas para la tabla, etc. System – acá se tienen opciones genéricas para la aplicación Sqlite Help – este menú incluye las opciones de ayuda del sistema. 11 SGBD SQLITE Por último, se tiene una extensión para el navegador Mozilla Firefox, que se lo puede agregar para utilizarlo desde el mismo como herramienta de gestión. La misma tiene opciones similares a SQLite Manager. 12 SGBD SQLITE 5. Bases de Datos y Tipos de Datos en SQLite La mayoría de los motores de base de datos SQL utiliza tipado de datos estático y rígido. De esta manera, el tipo de dato de un valor está determinado por su contenedor, es decir la columna particular en la cual se almacena. SQLite utiliza un sistema de tipos dinámico más general. Aquí, el tipo de datos de una columna es el valor propiamente dicho, no el tipo definido en sí de la columna. Es compatible con la mayoría de tipos de las bases de datos generales de los demás sistemas gestores de base de datos sin problemas. La característica del tipado de datos de ser dinámico, permite llevar a cabo ciertas operaciones que no pueden ser realizadas con otros SGBD. Los tipos de datos básicos de SQLite son: NULL – para indicar que no posee valor INTEGER – para el valor de los enteros, de 1 a 8 bytes. REAL – es valor de un número en coma flotante. TEXT – para el tipo de datos de un String. BLOB – es el valor de un objeto de datos grande, el cual se almacena exactamente como se lo obtuvo en la entrada. El tipo de datos booleano, en SQLite se almacena como un entero (0 ó 1). Los datos de tipo fecha y hora en SQLite no tienen un tipo definido, por lo cual se debe adaptar su estructura en los tipos básicos TEXT, INTEGER O REAL. También podemos utilizar el concepto de nombres afines (Affinity) para referirnos a algunos tipos de datos. De esta manera, se puede lograr compatibilidad con los tipos de datos manejados por otros SGBD o lenguajes de programación. En la siguiente tabla se pueden visualizar algunos: Nombre Affinity Tipo Real INT INTEGER INTEGER TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8 CHARACTER(20) TEXT VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) 13 SGBD SQLITE NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOB BLOB REAL DOUBLE DOUBLE PRECISION FLOAT NUMERIC DECIMAL(10,5) BOOLEAN DATE DATETIME BLOB REAL NUMERIC Además el sistema gestor admite el uso de clave primaria para los registros de la tabla. También brinda soporte a las operaciones básicas como ser UNION, INTERSECT, GROUP BY, ORDER BY, etc. Todo lo anterior y lo establecido en el estándar SQL-ANSI 92. 6. Operaciones básicas en SQLite Crear base de datos Para crear una base de datos, se utiliza el siguiente comando desde la consola del sistema: Sqlite3 baseDeDatos.db Y se creará un archivo con el nombre de la base de datos y la extensión .db. Por ejemplo, en el directorio siguiente tenemos dos archivos correspondientes a dos bases de datos llamadas “Contacto” y “Registro”: 14 SGBD SQLITE Luego consultamos por las bases de datos del sistema, con el comando .databases: Crear una tabla CREATE TABLE nomTabla (atr1 tipoDato, atr2 tipoDato, PRIMARY KEY(atr1)) Aquí se pueden utilizar los calificadores para los atributos NOT NULL, UNIQUE y CHECK. La estructura gráfica es: 15 SGBD SQLITE Inserciones, modificaciones y eliminaciones En este caso, la sintaxis es la misma que la definida en el estándar definido para SQLANSI. a. Inserción INSERT INTO TABLE VALUES(VALOR1, VALOR2, VALOR3,…) La estructura gráfica es: 16 b. SGBD SQLITE Eliminación DELETE FROM TABLA WHERE (CONDICION) Y la estructura gráfica es: 17 c. SGBD SQLITE Actualización UPDATE TABLE SET (CAMPO=VALOR_NUEVO) WHERE (CONDICION) Y la estructura gráfica es: 18 SGBD SQLITE Consultas en general Las consultas se realizan mediante SELECT. SELECT atr1, atr2, atr3 FROM TABLA WHERE (CONDICION); Y la estructura gráfica es: 19 SGBD SQLITE Además de todo lo anterior, se dispone de funciones y operaciones generales que se pueden llevar a cabo en el SGDB, como ser: Crear, actualizar y eliminar Índices. Crear, actualizar y eliminar Vistas. Crear, actualizar y eliminar Triggers. Gestionar transacciones. Funciones de agregación: promedio, suma, conteo, etc. o Avg(x) o Count(x) o Sum(x) o Total(x) o Max(x) o Min(x) o Etc. 20 SGBD SQLITE La sintaxis de las mismas se puede visualizar en el sitio oficial del SQLite, en http://www.sqlite.org/lang.html. Además mediante las herramientas GUI como ser SQLite Manager y el plugin de Mozilla Firefox se pueden realizar estas operaciones visualmente. 7. SQLite en Aplicaciones Java Se puede desarrollar una aplicación Java que maneje bases de datos SQLite, para lo cual se requiere tener instalados los siguientes componentes: El SGBD SQLite. SQLite Manager. Driver para Java de SQLite, que se puede descargar gratuitamente desde http://www.zentus.com/sqlitejdbc/. El entorno de desarrollo ECLIPSE IDE. Los pasos a realizar son: 1. 2. 3. 4. Crear la base de datos en SQLITE MANAGER. Crear un proyecto de Java en Eclipse. Agregar el Driver para SQLite en el proyecto. Escribir el código fuente. A continuación se presentará un ejemplo de una aplicación que consulta una tabla denominada “contacto” que posee la siguiente estructura: CONTACTO Atributo Tipo Nombre String Apellido String TipoTel String NroTel String Las clases básicas que son requeridas en la aplicación para realizar la consulta de datos a una base de datos SQLite existente son: Una clase para modelar un objeto que represente a la tabla, en este caso sería Registro.java. Una clase que permita gestionar la conexión a la base de datos, Conexión.java. Una clase que permita efectuar las operaciones en la base de datos, ABM.java. Una clase para mostrar los datos en la interface gráfica, GUI.java. De las anteriores, las clases que se encuentran relacionadas con el acceso la base de datos son: 21 SGBD SQLITE Clase Registro.java – Esta clase posee los atributos asociados a los campos de la tabla, el constructor y los getters y setters. public class Registro { public String nombre; public String apellido; public String tipoTel; public String nroTel; public Registro(String nombre, String apellido, String tipoTel, String nroTel){ this.nombre = nombre; this.apellido = apellido; this.tipoTel = tipoTel; this.nroTel = nroTel; } /** * @return the nombre */ public String getNombre() { return nombre; } /** * @param nombre the nombre to set */ public void setNombre(String nombre) { this.nombre = nombre; } /** * @return the apellido */ public String getApellido() { return apellido; } /** * @param apellido the apellido to set */ public void setApellido(String apellido) { this.apellido = apellido; } /** * @return the tipoTel */ public String getTipoTel() { return tipoTel; } /** * @param tipoTel the tipoTel to set */ 22 SGBD SQLITE public void setTipoTel(String tipoTel) { this.tipoTel = tipoTel; } /** * @return the nroTel */ public String getNroTel() { return nroTel; } /** * @param nroTel the nroTel to set */ public void setNroTel(String nroTel) { this.nroTel = nroTel; } } Clase Conexión.java – esta clase inicializa el driver y efectúa la conexión a la base de datos. En la misma Connection es el objeto que permite manejar las conexiones a la base de datos y Statement el objeto que permite manejar las consultas. package proyectosqlitefabio; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import javax.swing.JOptionPane; public class Conexion { Connection conexion; Statement consulta; public String ruta; /** * Constructor for objects of class Conexion */ public Conexion() { //C:\SQLITE DB ruta = "C:/SQLITE DB/contacto.db"; } public void conectar(){ try { Class.forName("org.sqlite.JDBC"); } catch (ClassNotFoundException e) { 23 SGBD SQLITE //JOptionPane.showMessageDialog(null, e.getMessage()); JOptionPane.showMessageDialog(null, "Error. No se encontró el driver para conectar a la base de datos"); } try { conexion = DriverManager.getConnection("jdbc:sqlite:"+ruta); consulta = conexion.createStatement(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, e.getMessage()); } } } ABM.java – es la clase donde se realizan las operaciones SQL. La misma extiende de conexión para conectarse a la base de datos y realizar operaciones con la misma. El método insertarRegistro utiliza el método executeUpdate(String sql) con un parámetro de tipo string, que es la sentencia SQL a ejecutar en la base de datos. Aquí se puede escribir cualquier tipo de consulta y el SGBD la ejecutará y devolverá un ResultSet, que es un puntero sobre una ventana de memoria para recorrer y retornar los datos. El método consultarRegistros(String sql) es similar al insertarRegistro y lo que hace es consultar y retornar los datos de la base de datos. import java.sql.ResultSet; import java.sql.SQLException; import javax.swing.JOptionPane; public class ABM extends Conexion{ public ABM(){ System.out.println("Clase de ABM de contactos"); } public boolean insertarRegistro(String sql){ boolean valor = true; conectar(); try { consulta.executeUpdate(sql); JOptionPane.showMessageDialog(null, "Operacion realizada con exito"); } catch (SQLException e) { valor = false; JOptionPane.showMessageDialog(null, e.getMessage()); } finally{ try{ consulta.close(); conexion.close(); }catch (Exception e){ e.printStackTrace(); } } return valor; SGBD SQLITE 24 } public ResultSet consultarRegistros(String sql){ conectar(); ResultSet resultado = null; try { resultado = consulta.executeQuery(sql); } catch (SQLException e) { System.out.println("Mensaje:"+e.getMessage()); System.out.println("Estado:"+e.getSQLState()); System.out.println("Codigo del error:"+e.getErrorCode()); JOptionPane.showMessageDialog(null, ""+e.getMessage()); } return resultado; } } Lo anterior constituye una implementación muy básica de un ABM mediante sentencias SQL sobre la base de datos SQLite. Luego se podría agregar mayores funcionalidades o extenderlas para incorporar más características a la aplicación. En la plataforma Android se dispone de la clase SQLiteDatabase, mediante la cual se puede trabajar con bases de datos SQLite.