Clase:013 1 Unidad IV Aplicaciones sobre Base de Datos 2 Agenda • PROGRAMA DE MANIPULACION DE BASE • ANDROID • SQLITE • SQLITE OpenHelper • SQLITE Database • Cursor • Ejemplos • Agregar controles según campo • Usar query para funciones de agregado 3 SQLITE • Sin Configuración: SQLite no necesita ser instalado, no necesita iniciar procesos, no necesita una configuración inicial o cualquier otro. SQLite es una librería, no un motor de base de datos • Transaccional: SQLite realiza transacciones que cumplen con ACID(Atomic, Consistent, Isolated, Durable). Para realizar estos realiza un proceso de Serializacion. 4 SQLITE Dependiendo de la versión de SQLite que se encuentre instalada en la versión de Android donde se ejecuta la aplicación, podemos usar las siguientes características: Creación, Alteración y eliminación de tablas Vistas Índices Llaves extranjeras Integridad Referencial Soporte para datos tipo BLOB Soporte para Transacciones Tablas temporales Y muchas mas… 5 SQLITE Android provee varios métodos, clases, interfaces, etc para construir, consultar, actualizar, crear, actualizar y borrar registros, etc. Entre estos tenemos • SQLiteOpenHelper Provee los métodos para crear o actualizar una base de datos • SQLiteDatabase Provee los métodos para realizar querys contra la base de datos. También provee métodos para realizar inserts, updates y deletes. • Cursor Almacena los resultados devueltos por un query. Y provee métodos para moverse de uno en uno. 6 SQLITE OpenHelper Luego de tener creada nuestra implementación del SQLiteOpenHelper, es decir, tenemos creada nuestra base de datos, creamos una instancia a traves llamando directamente al Constructor. • Si Android encuentra que esa base de datos no existe, ejecutara a la implementación del metodo onCreate(). Sino nos devolverá un SQLiteOpenHelper con la podemos recuperar la base de datos. • Si Android encuentra que la base de datos tiene una versión diferente de la especificada en su método onCreate(), ejecutara el método onUpgrade() para llevar a la base de datos a la nueva versión. • En el método onUpgrade() es llamado para realizar tareas como mover la información, eliminar las tablas existentes, etc. 7 SQLITE Database • Una vez tenemos implementado los métodos para crear y/o actualizar la base de datos, usamos los métodos del SQLiteOpenHelper getWritableDatabase () y getReadableDatabase () para obtener un objeto SQLiteDatabase. • Los métodos hacen exactamente lo mismo y devuelven el mismo objeto. La diferencia es que si por algún motivo la base de datos no puede ser abierta getWritableDatabase() lanzara un excepción y getReadableDatabase() intentara abrir la base de datos en modo solo lectura, sino lo consigue, lanzara una excepción. • Debemos tener el cuidado siempre de que al terminar la operación o transacciones a nuestra base de datos llamamos al método close() del SQLiteOpenHelper para cerrar cualquier base de datos abierta y recuperar recursos. 8 SQLITE Database • El objeto SQLiteDatabase ofrece varios métodos para ejecutar consultas sobre la base de datos. Como por ejemplo: • execSQL(String sql) • Ejecuta un consulta SQL que no devuelve parámetros ni el numero de filas afectadas. 9 SQLITE Database • Para insertar registros usamos el método : • long insert (String table, String nullColumnHack, ContentValues values) • El parámetro nullColumnHack, especifica las columnas en donde ser debe de insertar un null. Este parámetro solo se insertara para producir una fila en blanco. Normalmente ira null 10 SQLITE Database • Ejemplo de insert 11 SQLITE Database • Para actualizar llamamos al método int update (String table, ContentValues values, String whereClause, String[] whereArgs) que nos devuelve el numero de filas afectadas • Si pasamos null en el parámetro “whereClause” todas las filas de la tabla serán actualizadas con los valores. • La clausula where puede ser especificada totalmente en texto concatenando valores, así: Db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) • O podemos construirla para pasar los parametros en un arreglo de strings, así: mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=?", String[] {rowid}); 12 SQLITE Database • Para borrar registros, usamos el método: int delete (String table, String whereClause, String[] whereArgs) • A este método se le especifica el nombre de la tabla, la clausula where y los argumentos si existieran. • Si pasamos null, a la clausula where eliminamos todos los registros de la tabla. 13 SQLITE Database • Para realizar consultas de SELECT a la base de datos, el objeto SQLiteDatabase nos expone diferentes métodos para crear estas consultas con agregaciones, clausulas Where, having, order by etc. • Estos métodos devuelven un Objeto de tipo Cursor el cual permite leer los registros uno a uno. • El método se llama query y posee 3 variantes dependiendo de los parámetros que se le especifican 14 SQLITE Database Devuelve un cursor que ejecuta el select. • Para crear estas consultas, ocupamos la misma sintaxis de SQL normal, excepto que no incluimos las palabras reservadas(SELECT, GROUP BY, WHERE, etc.). SQLite las construye por nosotros • Pasando null a algún parámetro, provoca que se excluya la clausula. Por ejemplo, un null en el parámetro columns, devolverá todas las columnas(*), así que como un null en selection devolverá todas las filas(No existe un WHERE). 15 SQLITE Database Otras formas del método query son: El método anterior no incluye el parámetro limit. Por lo tanto no se puede limitar el numero de filas devueltas Este método, devuelve solo las filas cuya combinación de columnas es única, si el parámetro distinct es pasado en true. 16 SQLITE Database Otro método útil para crear consultas SELECT es: • rawQuery ejecuta una consulta SQL completa y devuelve un cursos con los resultados. • No debemos pasar el ; al final de la consulta. De lo contrario se producirá un error. 17 Cursor Una vez que hemos ejecutado la consulta y tenemos una instancia del Cursor, podemos extraer la información a través de varios métodos provistos por el. • Por default el cursor, se encuentra en la posición -1, es decir, antes de la primera fila. • Para colocar el cursor en al primera fila llamamos al método Cursor.moveToFirst(); lo que provoca que el cursor se coloque en la fila 0. Este método devuelve true si el movimiento resulto exitoso o false si no existen datos. • Otros métodos similares son moveToNext (), moveToPrevious (), moveToLast (), moveToPosition (int position). 18 Cursor • Cuando el cursor esta colocado en la posición deseada, el objeto provee métodos para extraer información dependiendo del tipo de dato • Por ejemplo, getBlob(int columnIndex) nos regresa un arreglo de bytes, getDouble(int columnIndex) un objeto tipo double, etc. • Un método útil para extraer el tipo de datos y evitar excepciones de casting es getType(int columnIndex), que nos devuelve el tipo de datos. Tambien podemos usar este metodo para comprobar si un dato es nulo • getType devuelve un entero que corresponde a valores definidos en la clase cursor, que corresponden a las constantes: Cursor.FIELD_TYPE_STRING 19 Cursor Cursor.FIELD_TYPE_BLOB Cursor.FIELD_TYPE_FLOAT Cursor.FIELD_TYPE_INTEGER Cursor.FIELD_TYPE_NULL • El índice que se pasa a estos métodos, puede ser recuperado usando el método getColumnIndex(String columnName) al cual especificamos el nombre de la columna. 20