Tema 4 5_1_acceso_datos

81
Análisis y Diseño de Software Departamento de Ingeniería de Sistemas Telemáticos http://moodle.dit.upm.es Tema 4.5.1 Acceso a Datos Base de Datos Carlos A. Iglesias <[email protected]>

description

Acceso a Datos en Android

Transcript of Tema 4 5_1_acceso_datos

Page 1: Tema 4 5_1_acceso_datos

Análisis y Diseño de Software

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

Tema 4.5.1Acceso a DatosBase de Datos

Carlos A. Iglesias <[email protected]>

Page 2: Tema 4 5_1_acceso_datos

Acceso a Datos 2

Teoría

Ejercicio práctico en el ordenador

Ampliación de conocimientos

Lectura / Vídeo / Podcast

Práctica libre / Experimentación

Leyenda

Page 3: Tema 4 5_1_acceso_datos

Acceso a Datos 3

Temario

● 4.1 Introducción a Android [Gar10, cap1-2 ]

● 4.2 Desarrollo con Android [Gar10, cap3-5]

● 4.3 Interfaces de Usuario [Gar10, cap6]

● 4.4 Intenciones y Servicios [Gar10, cap7-8]

● 4.5 Acceso a Datos [Gar10, cap9]

– 4.5.1 Base de datos [Gar10, cap9]

Page 4: Tema 4 5_1_acceso_datos

Acceso a Datos 4

Bibliografía

● Libro de texto: – [Gar10] Learning Android, Marko Gargenta,

O'Reilly, 2010, Cap 9-10. Disponible en http://ofps.oreilly.com/titles/9781449390501/

● Android Developers– http://developer.android.com/reference/android/app/Service.html

– http://developer.android.com/resources/tutorials/testing/helloandroid_test.html

– http://developer.android.com/guide/topics/testing/testing_android.html

– http://developer.android.com/resources/tutorials/testing/activity_test.html

Page 5: Tema 4 5_1_acceso_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 5_1_acceso_datos

Acceso a Datos 6

Motivación

● En el tema anterior teníamos un servicio que podía listar mensajes.

● Queremos guardar los mensajes en una base de datos en el terminal para poder mostrar algo incluso aunque no haya conexión

Page 7: Tema 4 5_1_acceso_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 5_1_acceso_datos

Acceso a Datos 8

SQLite y Android

http://www.sqlite.org/

Page 9: Tema 4 5_1_acceso_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 5_1_acceso_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 5_1_acceso_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 5_1_acceso_datos

Acceso a Datos 12

Consultar (select-from) / query (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 5_1_acceso_datos

Acceso a Datos 13

Consultar (select-from) / query (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 5_1_acceso_datos

Acceso a Datos 14

En Android...

● Usamos la clase 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()

Page 15: Tema 4 5_1_acceso_datos

Acceso a Datos 15

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 16: Tema 4 5_1_acceso_datos

Acceso a Datos 16

Base de datos en /data/data

Page 17: Tema 4 5_1_acceso_datos

Acceso a Datos 17

Ejemplo SQL - EjemploBaseDatosActivity

Llama a onCreate() de

DBHelper

Page 18: Tema 4 5_1_acceso_datos

Acceso a Datos 18

Ejemplo SQL DBHelper (I)

Page 19: Tema 4 5_1_acceso_datos

Acceso a Datos 19

Ejemplo SQL DBHelper (II)

Page 20: Tema 4 5_1_acceso_datos

Acceso a Datos 20

Ejemplo SQL DBHelper (III)

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

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

Page 21: Tema 4 5_1_acceso_datos

Acceso a Datos 21

Ejemplo SQL DBHelper (IV)

Page 22: Tema 4 5_1_acceso_datos

Acceso a Datos 22

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 23: Tema 4 5_1_acceso_datos

Acceso a Datos 23

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 24: Tema 4 5_1_acceso_datos

Acceso a Datos 24

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', 'Perez', '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);

SQL no permite insertar una columna null. Si valores es null, debemos indicar al

menos el nombre de una columna que permite meter un valor NULL. No es válido

INSERT INTO tabla. Hacemos INSERT INTO tabla (col1) VALUES (null);

Page 25: Tema 4 5_1_acceso_datos

Acceso a Datos 25

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 26: Tema 4 5_1_acceso_datos

Acceso a Datos 26

Borrar la BD... Settings → Applications

Page 27: Tema 4 5_1_acceso_datos

Acceso a Datos 27

Ejemplo Yamba

● Vamos a crear una BD para el timeline– La encapsulamos en una clase StatusData

Page 28: Tema 4 5_1_acceso_datos

Acceso a Datos 28

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, StatusData sigue el patrón DAO del valor Status de Twitter

Page 29: Tema 4 5_1_acceso_datos

Acceso a Datos 29

StatusData (I)

Page 30: Tema 4 5_1_acceso_datos

Acceso a Datos 30

StatusData (II)

Page 31: Tema 4 5_1_acceso_datos

Acceso a Datos 31

StatusData (III)

Page 32: Tema 4 5_1_acceso_datos

Acceso a Datos 32

StatusData (IV)

Page 33: Tema 4 5_1_acceso_datos

Acceso a Datos 33

YambaSingleton3 (I)

Page 34: Tema 4 5_1_acceso_datos

Acceso a Datos 34

YambaSingleton3 (II)

Page 35: Tema 4 5_1_acceso_datos

Acceso a Datos 35

YambaSingleton3 (III)

Page 36: Tema 4 5_1_acceso_datos

Acceso a Datos 36

YambaSingleton3 (IV)

Page 37: Tema 4 5_1_acceso_datos

Acceso a Datos 37

UpdaterService4 (I)

Page 38: Tema 4 5_1_acceso_datos

Acceso a Datos 38

UpdaterService4 (II)

Page 39: Tema 4 5_1_acceso_datos

Acceso a Datos 39

UpdaterService4 (III)

Page 40: Tema 4 5_1_acceso_datos

Acceso a Datos 40

StatusActivity7 (I) (sin cambios)

Page 41: Tema 4 5_1_acceso_datos

Acceso a Datos 41

StatusActivity7 (II)

Page 42: Tema 4 5_1_acceso_datos

Acceso a Datos 42

StatusActivity7 (III)

Page 43: Tema 4 5_1_acceso_datos

Acceso a Datos 43

StatusActivity7 (IV)

Page 44: Tema 4 5_1_acceso_datos

Acceso a Datos 44

Lanzamos servicio...

Page 45: Tema 4 5_1_acceso_datos

Acceso a Datos 45

Lo que llevamos hecho...

Page 46: Tema 4 5_1_acceso_datos

Acceso a Datos 46

Yamba

● Vamos a mostrar los mensajes, recuperándolos de la base de datos

● Hacemos dos versiones– Una simple, con una nueva actividad que

muestre los mensajes– Otra más avanzada usando Adaptadores

Page 47: Tema 4 5_1_acceso_datos

Acceso a Datos 47

Cambios en la aplicación

● Queremos que cuando empiece el usuario en vez de la pantalla de Status, empiece con la pantalla de Timeline

● Pero... queremos que en ambas actividades el usuario pueda acceder a las opciones

Page 48: Tema 4 5_1_acceso_datos

Acceso a Datos 48

BaseActivity

- MovemosonCreateOptionsMenu() y onOptionsItemSelected() de StatusActivity a BaseActivity- Aprovechamos y cambiamos los dos botones start/stop service por uno (toggleService) que conmute

Page 49: Tema 4 5_1_acceso_datos

Acceso a Datos 49

res/values/strings.xml

Page 50: Tema 4 5_1_acceso_datos

Acceso a Datos 50

res/values/menu/menu2.xml

Page 51: Tema 4 5_1_acceso_datos

Acceso a Datos 51

BaseActivity

● New->Java Class

Page 52: Tema 4 5_1_acceso_datos

Acceso a Datos 52

BaseActivity (I)

Page 53: Tema 4 5_1_acceso_datos

Acceso a Datos 53

BaseActivity (II)

Page 54: Tema 4 5_1_acceso_datos

Acceso a Datos 54

BaseActivity (III)

Page 55: Tema 4 5_1_acceso_datos

Acceso a Datos 55

StatusActivity8 (I)

Sin gestionar el menú (lo hereda), quitados

onCreateOptionsMenu y onOptionsItemSelected

Page 56: Tema 4 5_1_acceso_datos

Acceso a Datos 56

StatusActivity8 (II)

Page 57: Tema 4 5_1_acceso_datos

Acceso a Datos 57

StatusActivity8 (III)

Page 58: Tema 4 5_1_acceso_datos

Acceso a Datos 58

Layout res/layout/timeline_basic.xml

● New->Android XML file

Page 59: Tema 4 5_1_acceso_datos

Acceso a Datos 59

Layout timeline_basic.xml

Page 60: Tema 4 5_1_acceso_datos

Acceso a Datos 60

TimelineActivity1

● New->Java Class

Page 61: Tema 4 5_1_acceso_datos

Acceso a Datos 61

TimelineActivity1 (I)

Page 62: Tema 4 5_1_acceso_datos

Acceso a Datos 62

TimelineActivity1 (II)

Page 63: Tema 4 5_1_acceso_datos

Acceso a Datos 63

AndroidManifest.xml

Page 64: Tema 4 5_1_acceso_datos

Acceso a Datos 64

Ejecutamos... y menú

Page 65: Tema 4 5_1_acceso_datos

Acceso a Datos 65

Segunda iteración

● El widget ScrollView puede funcionar, pero si hubiera muchos registros, sería muy ineficiente

● Vamos a user ListView– Podríamos usar ListActivity como vimos con

los intents, pero extendemos BaseActivity y ListActivity es aconsejable cuando sólo hay un widget ListView en la actividad y usamos un array

Page 66: Tema 4 5_1_acceso_datos

Acceso a Datos 66

res/layout/timeline.xml

Page 67: Tema 4 5_1_acceso_datos

Acceso a Datos 67

res/layout/row.xml

Page 68: Tema 4 5_1_acceso_datos

Acceso a Datos 68

Adaptador

● Conectan una vista con una fuente de datos

Page 69: Tema 4 5_1_acceso_datos

Acceso a Datos 69

SimpleCursorAdaptor

● En Eclipse la clase SimpleCursorAdaptor nos permite adaptar una base de datos a una vista– Debemos describir un registro (fila, en

row.xml), los datos (el cursor) y la correspondencia entre datos y la vista

Page 70: Tema 4 5_1_acceso_datos

Acceso a Datos 70

TimelineActivity2 (I)

Page 71: Tema 4 5_1_acceso_datos

Acceso a Datos 71

TimelineActivity2 (II)

Page 72: Tema 4 5_1_acceso_datos

Acceso a Datos 72

Actualizamos...

● AndroidManifest a TimelineActivity2● BaseActivity a TimelineActivity2 en el

switch

Page 73: Tema 4 5_1_acceso_datos

Acceso a Datos 73

Ejecutamos...

Se ve mal timestamp, vamos a arreglarlo

Page 74: Tema 4 5_1_acceso_datos

Acceso a Datos 74

ViewBinder

● Es un pequeño detalle● Inyectamos lógica de negocio que

convierte una marca de tiempo (timestamp) en tiempo relativo

Page 75: Tema 4 5_1_acceso_datos

Acceso a Datos 75

TimelineActivity3 (I)

Page 76: Tema 4 5_1_acceso_datos

Acceso a Datos 76

TimelineActivity3 (II)

Page 77: Tema 4 5_1_acceso_datos

Acceso a Datos 77

TimelineActivity3 (III)

Page 78: Tema 4 5_1_acceso_datos

Acceso a Datos 78

Ejecutamos...

Page 79: Tema 4 5_1_acceso_datos

Acceso a Datos 79

Lo que llevamos hecho...

Page 80: Tema 4 5_1_acceso_datos

Acceso a Datos 80

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 scroll o un

adaptador– Buenas prácticas como refactorización

Page 81: Tema 4 5_1_acceso_datos

Acceso a Datos 81

¿Preguntas?