Tema 4.7 Acceso a datos

51
Análisis y Diseño de Software Departamento de Ingeniería de Sistemas Telemáticos http://moodle.dit.upm.es Acceso a datos Carlos A. Iglesias <[email protected]> v1.1 3/05/2013

Transcript of Tema 4.7 Acceso a datos

Page 1: Tema 4.7 Acceso a datos

Análisis y Diseño de Software

Departamento de Ingeniería de Sistemas Telemáticoshttp://moodle.dit.upm.es

Acceso a datos

Carlos A. Iglesias <[email protected]>

v1.1 3/05/2013

Page 2: Tema 4.7 Acceso a datos

Acceso a datos 2

Temario

● 4.1 Introducción a Android ● 4.2 Introducción Desarrollo con Android● 4.3 Ejemplo Desarrollo y Depuración ● 4.4 Actividades● 4.5 Interfaces de Usuario● 4.6 Intenciones● 4.7 Acceso a Datos● 4.8 Preferencias● 4.9 Hebras e internacionalización

Page 3: Tema 4.7 Acceso a datos

Acceso a datos 3

Teoría

Ejercicio práctico en el ordenador

Ampliación de conocimientos

Lectura / Vídeo / Podcast

Práctica libre / Experimentación

Leyenda

Page 4: Tema 4.7 Acceso a datos

Acceso a datos 4

● Android Developers

Bibliografía

http://developer.android.com/training/basics/data-storage/index.html

Page 5: Tema 4.7 Acceso a datos

Acceso a datos 5

Objetivos

● Aprender a utilizar almacenamiento persistente ● Recordar bases de datos y SQL● Aprender a crear tablas, y consultar, insertar y borrar datos en una tabla● Aprender a mostrar datos en una lista en una actividad

Page 6: Tema 4.7 Acceso a datos

Acceso a datos 6

Motivación

● En las aplicaciones es habitual querer guardar datos

● Android nos ofrece varias alternativas de almacenamiento persistente:– Bases de datos (este tema)– Pares atributos valor (preferencias)– Sistema de ficheros (interno o externo en SD)– Conexión de red para almacenar datos de forma

remota

Page 7: Tema 4.7 Acceso a datos

Acceso a datos 7

Base de Datos

● Ya vimos en FTEL– Que las Bases de Datos permitían guardar

datos de forma persistente– Que con SQL podíamos realizar diversas

operaciones, como consultar (SELECT-FROM), modificar (UPDATE), borrar (DELETE) o insertar datos (INSERT)

Page 8: Tema 4.7 Acceso a datos

Acceso a datos 8

SQLite y Android

http://www.sqlite.org/

Page 9: Tema 4.7 Acceso a datos

Acceso a datos 9

SQLite

● Utilizada internamente por Firefox y Thuderbird

● Usada en múltiples sistemas operativos para dispositivos móviles (Android, iOS, Blackberry OS)

● No tiene claves ajenas (FOREIGN KEYS)

Page 10: Tema 4.7 Acceso a datos

Acceso a datos 10

Repaso SQL – create table

create table tblLIBROS (libroID integer PRIMARY KEY autoincrement, titulo text, autor text, anno integer)

Tipos: text, varchar, integer, float, numeric, date, time, timestamp,

boolean, blob, etc.http://sqlite.org/datatype3.html

Page 11: Tema 4.7 Acceso a datos

Acceso a datos 11

Repaso SQL - insertar

insert into tblLIBROS(autor, titulo, anno) VALUES ('autor1', 'libro1', 2001);insert into tblLIBROS(autor, titulo, anno) VALUES ('autor2', 'libro2', 2002);insert into tblLIBROS(autor, titulo, anno) VALUES ('autor1', 'libro3', 2001);insert into tblLIBROS(autor, titulo, anno) VALUES ('autor4', 'libro4', 2004);

Page 12: Tema 4.7 Acceso a datos

Acceso a datos 12

Consultar (select-from) (I)

● select [distinct] <campos> from <tablas> where <condicion>group by <campos> having <grupos>order by <campos> [ASC|DESC];● Ej. listar todos los autores

● Ej. listar autor, titulo y año anterior a 2002 select distinct autor from tblLIBROS;

select * from tblLIBROS where anno <= 2002;

Page 13: Tema 4.7 Acceso a datos

Acceso a datos 13

Consultar (select-from) (II)

● Ej. listar autor, titulo y año anterior a 2002 ordenado por autor

● Ej. listar cuántos autores hay por año

select * from tblLIBROS where anno <= 2002 ordered by autor;

select anno, count(*) from tblLIBROS grouped by anno;

Page 14: Tema 4.7 Acceso a datos

Acceso a datos 14

Usando BBDD en Android

● Debemos extender la clase SQLiteOpenHelper y sobreescribir onCreate() para crear las tablas en la base de datos

● Para escribir y leer debemos llamar a los métodos getWritableDatabase() o getReadableDatabase() que nos devuelven un objeto SQLiteDatabase

● SQLiteDatabase tiene métodos para ejecutar sentencias SQL

Page 15: Tema 4.7 Acceso a datos

Acceso a datos 15

SQLiteDatabase

● Nos da dos interfaces:– Ejecutar SQL

• execSQL(String sql) → CREATE, INSERT, UPDATE, DELETE

• rawQuery(String sql, String [] args) → SELECT

– Orientada a objetos (veremos)• query(), delete(), insert(), update()

● Las consultas (queries) devuelven un Cursor que apunta a los registros (filas) del resultado de la consulta

Page 16: Tema 4.7 Acceso a datos

Acceso a datos 16

Ejemplo

SQLiteDatabase db = SQLiteDatabase.openOrCreate(“ejemplo.libros”, MODE_PRIVATE, null);String sql = "create table tblLIBROS ("

+ "libroID integer PRIMARY KEY autoincrement, "+ "titulo text, "+ "autor text, "+ "anno integer"+ ");";

db.execSQL(sql);String sqlInsert = "insert into tblLIBROS (autor, titulo, anno) VALUES ('autor1', 'libro1', 2001); ";db.execSQL(sql);String sqlSelect = "select distinct autor from tblLIBROS;";Cursor c = db.rawQuery(sqlSelect, null);int autorIdCol = c.getColumnIndex("autor");while (c.moveToNext()) {

Log.d(c.getString(autorIdCol));}

Cursor

Page 17: Tema 4.7 Acceso a datos

Acceso a datos 17

Base de datos en /data/data

Page 18: Tema 4.7 Acceso a datos

Acceso a datos 18

Ejemplo SQL - EjemploBaseDatosActivity

Llama a onCreate() de

DBHelper

Page 19: Tema 4.7 Acceso a datos

Acceso a datos 19

Ejemplo SQL DBHelper (I)

Page 20: Tema 4.7 Acceso a datos

Acceso a datos 20

Ejemplo SQL DBHelper (II)

Page 21: Tema 4.7 Acceso a datos

Acceso a datos 21

Ejemplo SQL DBHelper (III)

int autorIdCol = c.getColumnIndex("autor");while (c.moveToNext()) {

Log.d(c.getString(autorIdCol));}

Page 22: Tema 4.7 Acceso a datos

Acceso a datos 22

Ejemplo SQL DBHelper (IV)

Page 23: Tema 4.7 Acceso a datos

Acceso a datos 23

Consultas parametrizadas

● Podemos usar sentencias SQL parametrizadas● Ej.

String sql = “select * from tblLIBROS where anno >= ? and anno <= ?”;String [] args = {“2000”, “2004” };db.execSQL(sql, args);

Page 24: Tema 4.7 Acceso a datos

Acceso a datos 24

SQLiteDatabase - query()

query(String tabla, String [] columnas, String where, String [] whereArgs, String groupBy, String having, String orderBy);

select columnas from tablawhere seleccióngroup by columnas having condicionorder by columnas

String sql = “select nombre, apellidos, sueldo from Empleados “;sql += “where sueldo >= ? and sueldo <= ? ”;sql += “order by nombre, apellidos”;String [] args = {“1000”, “2000”};Cursor c = db.rawQuery(sql, args);

String [] cols = {“nombre”, “apellidos”, “sueldo”};String where = “sueldo >= ? and sueldo <= ?”;String [] whereArgs = {“1000”, “2000”};String order = “nombre, apellidos”;Cursor c = db.query(“Empleados”, cols, where, whereArgs, null, null, order);

Page 25: Tema 4.7 Acceso a datos

Acceso a datos 25

SQLiteDatabasedelete(),insert()

public int delete(String tabla, String where, String [] whereArgs);public long insert(String tabla, String nullColumnHack, ContentValues valores);

String sqlInsert = “insert into Empleados values( 'Pepe', 'Pérez', '1000');db.execSQL(sqlInsert);

String sqlDelete = “delete from Empleados where nombre = 'Pepe'”;db.execSQL(sqlDelete);

db.delete(“Empleados”,”nombre = 'Pepe'” , null);

ContentValues valores = new ContentValues(); // Map<String, String>valores.put(“nombre”, “Pepe”);valores.put(“apellidos”, “Perez”);valores.put(“sueldo”, “1000”);db.insert(“Empleados”, null, valores);

NullColumnHack: pasar null si todas las columnas deben ser NOT NULL, o bien el

nombre de una columna que puede ser null

Page 26: Tema 4.7 Acceso a datos

Acceso a datos 26

SQLiteDatabase - update()

public int update(String tabla, ContentValues valores, String where, String [] whereArgs);

ContentValues valores = new ContentValues(); // Map<String,String>valores.put(“nombre”, “Jose”);

db.update(“Empleados”, valores, “nombre='Pepe'”, null);

String sqlUpdate = “update Empleados set nombre = 'Jose' where nombre = 'Pepe'”;db.execSQL(sqlUpdate);

Page 27: Tema 4.7 Acceso a datos

Acceso a datos 27

Borrar la BD... Settings → Applications

Page 28: Tema 4.7 Acceso a datos

Acceso a datos 28

Ejemplo ListaCompra

● Vamos a crear una BD para ella lista de la compra– La encapsulamos en una clase

ProductoDbAdaptador

Page 29: Tema 4.7 Acceso a datos

Acceso a datos 29

Patrón de Diseño DAO

● DAO (Data Access Object)

● Un DAO contiene una conexión a una base de datos y sus operaciones básicas, ocultando su implementación

● En nuestro caso, ProductoDbAdaptador sigue el patrón DAO del valor Producto

Page 30: Tema 4.7 Acceso a datos

Acceso a datos 30

Clases BBDD

Page 31: Tema 4.7 Acceso a datos

Acceso a datos 31

Producto

+ setters, getters, ...

Page 32: Tema 4.7 Acceso a datos

Acceso a datos 32

ProductoDbAdaptador (I)

Page 33: Tema 4.7 Acceso a datos

Acceso a datos 33

ProductoDbAdaptador (II)

Page 34: Tema 4.7 Acceso a datos

Acceso a datos 34

ProductoDbAdaptador (IV)

Page 35: Tema 4.7 Acceso a datos

Acceso a datos 35

DBHelper

Page 36: Tema 4.7 Acceso a datos

Acceso a datos 36

La aplicación ...

Page 37: Tema 4.7 Acceso a datos

Acceso a datos 37

Las actividades...

Puedopasar también

Productocon Serializable

ver ejemplo

Page 38: Tema 4.7 Acceso a datos

Acceso a datos 38

ListaCompraActivity (I)

Page 39: Tema 4.7 Acceso a datos

Acceso a datos 39

Adaptador

● Conectan una vista con una fuente de datos

Fuente de datosAdaptador

Page 40: Tema 4.7 Acceso a datos

Acceso a datos 40

SimpleCursorAdaptor

● La clase SimpleCursorAdaptor nos permite adaptar una base de datos a una vista– Debemos describir un registro (fila, los datos

(el cursor) y la correspondencia entre datos y la vista

Page 41: Tema 4.7 Acceso a datos

Acceso a datos 41

ListaCompraActivity (II)

Page 42: Tema 4.7 Acceso a datos

Acceso a datos 42

ListaCompraActivity (III)

Page 43: Tema 4.7 Acceso a datos

Acceso a datos 43

ListaCompraActivity (IV)

Page 44: Tema 4.7 Acceso a datos

Acceso a datos 44

ListaCompraActivity (V)

Page 45: Tema 4.7 Acceso a datos

Acceso a datos 45

ListaCompraActivityonActivityResult (I)

Page 46: Tema 4.7 Acceso a datos

Acceso a datos 46

ListaCompraActivityonActivityResult (II)

Page 47: Tema 4.7 Acceso a datos

Acceso a datos 47

DetalleProductoActivity (I)

Page 48: Tema 4.7 Acceso a datos

Acceso a datos 48

DetalleProductoActivity (II)

Page 49: Tema 4.7 Acceso a datos

Acceso a datos 49

DetalleProductoActivity (III)

Page 50: Tema 4.7 Acceso a datos

Acceso a datos 50

Resumen

● En este tema hemos aprendido – Cómo almacenar, consultar, borrar, insertar y

actualizar bases de datos en Android– Cómo manejar cursores de bases de datos– Patrones de diseño como DAO o adaptador– Cómo extender una actividad con

funcionalidad común– Cómo mostrar datos en una vista con un

adaptador

Page 51: Tema 4.7 Acceso a datos

Acceso a datos 51

¿Preguntas?