sqlite - m.o.m.rachumhandroid.momrach.es/contenido/seccion06/transparencias/sqlit… · en el...

13
SQLITE

Upload: others

Post on 17-Jun-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

SQLITE

Page 2: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

SQLite

SQLite (http://www.sqlite.org/) es :• Una librería de software libre que implementa un gestor de bases de datos relacionales.• Adaptado para dispositivos de bajo consumo o móviles• Está escrito en C y rodeado de un envoltorio Java proporcionado por el SDK de Android• La base de datos se guarda como un único fichero en el dispositivo• El fichero está en un directorio en el programa que lo usa, no existe gestor de base de datos externo.• Todas las operaciones de base de datos se manejan dentro de la aplicación mediante llamadas y funciones

contenidas en la librería SQLite• Base de Datos de hasta 2 Terabytes de tamaño.• Permite campos de tipo BLOB (Binary Large Object) para almacenar archivos binarios grandes como puede ser

una imagen.• Es posible trabajar con Bases de Datos virtuales en memoria, sin archivo físicoVentajas• Ocupa muy poco espacio en disco y en memoria• Muy eficiente y rápido• Es multiplataforma• No requiere de administración / configuración del gestor• Es de dominio publico, open source.Inconvenientes• Es necesario conocer SQL para usarlo.• Las claves ajenas están desactivadas por defecto (facilitan las relaciones entre tablas).• Está integrado o autocontenido sin gestor externo.• No existen usuarios (acceso múltiples usuarios ni privilegios)• Para visualizar la BD hay que usar comandos de consola ADB o usar software externo:

• SQLite Database Browser• SQLite Manager (Google Chrome Extension)• SQLiteStudio• SQLite Expert

Page 3: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

Clases para trabajar con SQLite en AndroidNecesitaremos crear varias clases y trabajar con sus métodos para gestionar la base dedatos.• Contract Class

Suelen denominarle Contract Class o Schema Class.En ella declararemos nuestro DB Schema, o conjunto de entidades, es decir, el esquema de tablas, relaciones, constantes etc… que definen la base de datos. El esquema se declarará con subclases, definidas en la clase de Schema, que implementan la interfaz BaseColumnsDefiniremos constantes String que contendrán el código de creación y borrado de las entidades (tablas) de nuestra base de datos y que serán utilizados por la Helper Class (o por nuestro código cuando queramos)

• Helper ClassUna clase que nos va a ayudar a crear, actualizar (upgrade), restaurar, etc.. La base de datos.En ella declararemos la versión y el nombre de la base de datos.Sobrecargaremos onCreate() para crear la base de datosSobrecargaremos onUpgrade() para actualizar la base de datos cuando cambiemos la versión.

Cambiaremos la versión cuando modifiquemos la Schema Class, es decir, cuando cambie nuestro esquema entidad-relación.

Sobrecargaremos onDowngrade() para revertir (downgrade) la base de datos a una versión previa.

• Usaremos estas clases en nuestras Activities para acceder y gestionar la base de datos.

Page 4: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

Ejemplo de una Contract/Schema Class

Personas

Empresa.dbPK INTEGER Id

TEXT NombreTEXT Apellidos

Page 5: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

Ejemplo de una Helper Class

Personas

Empresa.dbPK INTEGER Id

TEXT NombreTEXT Apellidos

Page 6: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

Declaración e instanciación

Deberemos declarar la clase Helper como miembro de la Activity que vaya a utilizar labase de datos e instanciar nuestro Helper normalmente en el onCreate().

Deberemos cerrar la conexión con la base de datos cuando salgamos de la Activity.

public class MainActivity …

…//Declaramos la clase DBHelpberDBHelper dbHelper;

@Override protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

//Instanciamos la clase DBHelperdbHelper = new DBHelper(this);

@Overrideprotected void onDestroy() {

dbHelper.close();super.onDestroy();

}

Page 7: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

Declaración e instanciación

Para Ejecutar SQL Queries:execSQL() es la forma más sencilla de las disponibles en la API de SQLiteEste método se limita a ejecutar directamente el código SQL que le pasemos como parámetro.Este método permite ejecutar cualquier sentencia SQL sobre la base de datos, siempre que ésta no devuelva resultados.

En el onCreate() de la Helper Class tenemos un ejemplo de su uso, otros ejemplos podríanser los siguientes:

Otra alternativa disponible en la API de Android (Clase SQLiteDatabase) es utilizar losmétodos insert(), update() y delete()Estos métodos permiten realizar las tareas CRUD inserción, lectura, actualización yeliminación de registros de una forma más paramétrica que execSQL(), separando tablas,valores y condiciones en parámetros independientes de estos métodos.

//Insertar un registrodb.execSQL("INSERT INTO Usuarios (codigo,nombre) VALUES (6,'usuariopru') ");

//Eliminar un registrodb.execSQL("DELETE FROM Usuarios WHERE codigo=6 ");

//Actualizar un registrodb.execSQL("UPDATE Usuarios SET nombre='usunuevo' WHERE codigo=6 ");

Page 8: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

SQLite CRUD operations

Inserción (C - Create)Insertaremos registros en las tablas utilizando el método insert() de la base de datosAntes de insertar debemos obtener una instancia de la base de datos con el métodogetWritableDatabase() del nuestro Helper.

La primera vez que se llame creará el fichero .db en el directorio de la aplicación.Sucesivas llamadas devolverá el mismo objeto ya instanciado sin recrear el fichero de base de datos.

Es una operación costosa que debería sacarse del UIThread.Instanciaremos un objeto ContentValues para dar valor a los campos del registro. El objeto ContentValues es una colección de tipo diccionario que almacena parejas clave-valor que serán utilizadas por el método insert(). La clave será el nombre del campo, el valor será el dato del mismo.

Utilizamos el método insert()de nuestra base de datos parainsertar y comprobamos si ha tenido éxito.

// Gets the data repository in write mode SQLiteDatabase db = dbHelper.getWritableDatabase();

// Create a new map of values, where column names are the keys ContentValues values = new ContentValues();values.put( DBSchema.Personas.COL_ID, etId.getText().toString() ); values.put( DBSchema.Personas.COL_NOMBRE, etNombre.getText().toString() ); values.put( DBSchema.Personas.COL_APELLIDOS, etApellidos.getText().toString() );

// Insert the new row, returning the primary key value of the new row long newRowId = db.insert( DBSchema.Personas.TABLE_NAME, null, values); if (newRowId==-1){

Toast.makeText(this, "El registro ya existe", Toast.LENGTH_SHORT).show();return false;

}else {Toast.makeText(this, "Registro Insertado", Toast.LENGTH_SHORT).show(); return true;

}

Page 9: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

SQLite CRUD operations

Borrado (D - Delete)Para borrar registros de una tabla usaremos el método delete() de nuestra base de datos.Recibe tres parámetros: la tabla, una selección y los criterios de selección.La unión de la selección y los criterios de selección determinan el/los registros a eliminar de la tabla.En la selección usaremos el carácter ‘?’ para indicar donde ubicar los distintos criterios de selección.Éstos se ubicaran en los ? En el orden en los que aparezcan en la selección.

En el ejemplo el criterio de selección se recoge de un editText del UI

SQLiteDatabase db = dbHelper.getWritableDatabase();

// Define la parte 'where' de la query. String selection = DBSchema.Personas.COL_ID + " LIKE ?";

// Especifica los argumentos en el orden de aparición del placeholder (‘?’). String[] selectionArgs = { etId.getText().toString() };

// Lanza la sentencia SQLint deletedRows = db.delete(DBSchema.Personas.TABLE_NAME, selection, selectionArgs);

//Comprobaciónif (deletedRows==0){

Toast.makeText(this,"Registro no encontrado", Toast.LENGTH_SHORT).show(); return false;

}else{ Toast.makeText(this,"Registro Borrado", Toast.LENGTH_SHORT).show(); return true;

}

Page 10: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

SQLite CRUD operations

Actualizar (U - Update)Para actualizar registros de una tabla usaremos el método update() de nuestra base de datos.Recibe cuatro parámetros: la tabla, los valores, una selección y los criterios de selección.La unión de la selección y los criterios de selección determinan el/los registros a actualizar en la tabla.Los valores se pasan en un objeto ContentValues (pares clave-valor), que llevan como clave el nombrede la columna y como valor que actualiza al existente.En la selección usaremos el carácter ‘?’ para indicar donde ubicar los distintos criterios de selección.Éstos se ubicaran en los ? En el orden en los que aparezcan en la selección.

En el ejemplo no actualizamos el campo ID puesto que es nuestra PK de la tabla, los valores seextraen del UI

SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues values = new ContentValues(); values.put( DBSchema.Personas.COL_NOMBRE, etNombre.getText().toString()); values.put( DBSchema.Personas.COL_APELLIDOS, etApellidos.getText().toString());

// Selección de la fila a actualizar en función de su IDString selection = DBSchema.Personas.COL_ID + " LIKE ?"; String[] selectionArgs = { etId.getText().toString() };

int count = db.update(DBSchema.Personas.TABLE_NAME, values, selection, selectionArgs);

//Comprobacionif (count==1) Toast.makeText(this, "Registro Actualizado", Toast.LENGTH_SHORT).show(); else Toast.makeText(this, "Registro no encontrado", Toast.LENGTH_SHORT).show();

Page 11: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

SQLite CRUD operations

Leer (R - Read) Para leer registros de una tabla usaremos el método query() de nuestra base de datos.El método query() corresponde con una SELECT en SQL, pero recibe un conjunto de parámetros que componen la sentencia SELECT.El método query() recibe seis parámetros:

• La tabla, • Una proyección (projection): Conjunto de columnas que devuelve la consulta• Una selección • Los criterios de selección.• Una cláusula GroupBy• Una cláusula Having• Una cláusula OrderBy

La query() devolverá un Cursor.

Un Cursor es un conjunto de registros (Recordset) (resultado de la consulta) por el que podremos iterar.

En el ejemplo sólo buscamos una fila que concuerde con el Id por lo que no iteramos por el cursor, accedemos directamente al primer registro del cursor caso de haber sido exitosa la consulta.

Sólo obtenemos el nombre y apellidospuesto que se busca por Id

Los resultados los llevamos al UI.Los índices 0 y 1 hacen referencia a lascolumnas del cursor. También se puede acceder por nombre de columnacon otras funciones del cursor.

SQLiteDatabase db = dbHelper.getReadableDatabase(); // Define La projection: Columnas a obtener de la consultaString[] projection = {

DBSchema.Personas.COL_NOMBRE, DBSchema.Personas.COL_APELLIDOS};

String selection = selection = DBSchema.Personas.COL_ID + " = ?"; String[] selectionArgs = new String[]{ etId.getText().toString() } ;

Cursor cursor = db.query( DBSchema.Personas.TABLE_NAME,projection, //(pass null to get all) selection, selectionArgs,null, //No GroupBy in this querynull, //No filter by row groups in this querynull //No sort order in this query

);

//Colocamos el cursor en la primera ocurrencia si existetry {

cursor.moveToFirst(); etNombre.setText( cursor.getString(0) ); etApellidos.setText( cursor.getString(1) );

Toast.makeText(this,"Busqueda correcta", Toast.LENGTH_SHORT).show(); }catch (Exception e){

Toast.makeText(this,"No encontrado", Toast.LENGTH_SHORT).show(); }

Page 12: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

SQLite CRUD operations

Leer (R - Read) Para obtener un conjuntode registros realizaremos una query() cuya selectiondevuelva varios registros en el cursor.

En el ejemplo buscamos todas las filas e iteramos por el cursor, el cursor nos coloca en el primer registro y accedemos a los siguientes en bucle.

En este caso obtenemos también todas las columnas, Id, nombre y apellidos.

Los resultados los llevamos a un ArrayList<String> alPersonas que cargaremos en un ListView.

Aquí accedemos a las columnas del cursor por sunombre.

SQLiteDatabase db = dbHelper.getReadableDatabase();String strId, strNombre, strApellidos, strPersona;

//ESTA ES OTRA FORMA MÁS DIRECTA DE CREAR EL CURSOR PARA OBTENER LO MISMO.//Cursor cursor = db.rawQuery("select * from "+ DBSchema.Personas.TABLE_NAME,null);

String[] projection = {DBSchema.Personas.COL_ID,DBSchema.Personas.COL_NOMBRE,DBSchema.Personas.COL_APELLIDOS};

// How you want the results sorted in the resulting CursorString sortOrder = DBSchema.Personas.COL_ID + " ASC";

Cursor cursor = db.query(DBSchema.Personas.TABLE_NAME,projection,null, //No selection -> All recordsnull,null,null, sortOrder);

while(cursor.moveToNext()) { //Iteramos por el cursorstrId= cursor.getString(cursor.getColumnIndexOrThrow(DBSchema.Personas.COL_ID));strNombre= cursor.getString(cursor.getColumnIndexOrThrow(DBSchema.Personas.COL_NOMBRE));strApellidos=

cursor.getString(cursor.getColumnIndexOrThrow(DBSchema.Personas.COL_APELLIDOS));strPersona="("+ strId+") "+ strNombre + " " + strApellidos;alPersonas.add(strPersona);

}cursor.close();

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,

android.R.layout.simple_list_item_1,alPersonas);

//Ahora vinculamos el listView con el nuevo adapterlvPersonas.setAdapter(adapter);

Page 13: SQLite - M.O.M.Rachumhandroid.momrach.es/contenido/seccion06/transparencias/SQLit… · En el onCreate() de la Helper Class tenemos un ejemplo de su uso,otros ejemplos podrían ser

Ejemplo

Personas

Empresa.dbPK INTEGER Id

TEXT NombreTEXT Apellidos

Descargar, Analizar y Ejecutar: SimpleSQLite