La persistencia es un detalle imprescindible en la mayoría de aplicaciones. En esta charla se dará una visión de distintos mecanismos para persistir los datos en aplicaciones Android. Se hará especial énfasis en el uso de patrones de diseño para implementar la persistencia de manera que se incremente la flexibilidad y mantenibilidad de nuestras aplicaciones. La charla estará acompañada de ejemplos prácticos de código para ilustrar los principios descritos.
2. La empresa
§ Holding familiar. 3ª Generación
§ Más de 30 empresas.
§ Con 2.500 empleados.
§ Presente en 9 Comunidades.
§ Dando servicio a más de 1 millón de
personas.
2
4. La empresa
DEPARTAMENTO DE T.I.C.
28 personas
Área Software
Desarrollos a medidas en entornos
VB y Java
Proyectos de movilidad
Android
Web Responsive
Desarrollos Web:
Intranets corporativas
Extranets
Portales webs
Gestión Documental
Sist. de información Geográfica
(GIS)
SAP R3 – BI/BO
Área DataCenter y
Comunic.
Administración de servidores y
BBDD.
Virtualización de servidores
Gestión de comunicaciones y
radioenlaces/WIFI
Cloud privado - CPD propio (Tier
III)
Área de Microinf.
Mantenimiento integral
microinformático.
Asistencia remota
Soporte online
Auditorias del parque tecnológico.
Soporte de Helpdesk
Externalización de equipos de
impresión.
Venta de material informático
4
5. Índice
¿Qué es persistencia?
Retos de la persistencia en móviles
¿Cómo diseñar la persistencia de datos?
Mecanismos de persistencia de datos en Android
SQLite
ORMLite
Parse
Servicios REST
6. Índice
¿Qué es persistencia?
Retos de la persistencia en móviles
¿Cómo diseñar la persistencia de datos?
Mecanismos de persistencia de datos en Android
SQLite
ORMLite
Parse
Servicios REST
7. Conceptos básicos
¿Qué es la persistencia?
Almacenar los datos de la aplicación
para que estén disponibles al reiniciar
el software
10. Conceptos básicos
¿Es LO MÁS importante?
NO. Lo más importante son las reglas
de negocio de los usuarios/clientes
¿Entonces por qué muchas veces empezamos
diseñando e implementando la base de datos?
11. Conceptos básicos
¿Cómo persistir los datos?
Al usuario/cliente probablemente no le interese
BBDD Relacionales
Archivos Binarios
CSV
Servicios Web
Almacenamiento Cloud
BBDD NoSQL
XML
12. Conceptos básicos
¿Cómo persistir los datos?
¿Cómo podemos persistir en Android?
§ Preferencias
§
Parejas: clave -> valor
§
Configuraciones, recordar acciones, etc.
§ Almacenamiento de archivos
§
Almacenamiento interno o externo
§
Archivos arbitrarios (imágenes, json, xml, texto, binarios, etc.)
§ Datos estructurados
§
Base de datos SQL
§
Colecciones de datos estructurados y relacionados
13. Tipo de Persistencia
¿Cómo realizar la persistencia en móvil?
1.- Local
§ Almacenamiento en el propio móvil
§ Especio limitado. Acceso rápido. Alto coste consultas complejas
14. Tipo de Persistencia
¿Cómo realizar la persistencia en móvil?
2.- Remota en un servidor
§ El móvil sólo muestra datos, que lee de un servidor
§ Cada acceso a datos requiere un consulta
§ Alta latencia. Muy sensible a desconexiones
15. Tipo de Persistencia
¿Cómo realizar la persistencia en móvil?
3.- Mix (Cacheo/Hoarding)
§ Copia local de alguna información del servidor
§ Comunicación con el servidor para sincronizar
§ Funcional (más o menos) desconectado. Latencia según acierto.
16. Índice
¿Qué es persistencia?
Retos de la persistencia en móviles
¿Cómo diseñar la persistencia de datos?
Mecanismos de persistencia de datos en Android
SQLite
ORMLite
Parse
Servicios REST
18. Retos
Computación y memoria limitada
Consultas complejas lentas
§ Mejor preprocesar datos en el servidor
§ Desnormalizar BBDD si es posible
Alto consumo de batería
19. Retos
Restricciones de comunicación
Dificultad para sincronizar
§ Minimizar número de conexiones
§ Sólo datos relevantes para la aplicación
§ Sólo modificaciones a los datos
§ Preprocesar datos
20. Retos
Desconexiones habituales
Modo off-line. ¿Qué ocurre?
§ No funciona nada
§ Funcionamiento limitado (sólo lectura)
§ Funcionamiento completo (conflictos)
Recuperación conexión
§ Sincronización de datos
§ Resolución de conflictos
21. Índice
¿Qué es persistencia?
Retos de la persistencia en móviles
¿Cómo diseñar la persistencia de datos?
Mecanismos de persistencia de datos en Android
SQLite
ORMLite
Parse
Servicios REST
22. Diseño de la persistencia
El camino sin reflexionar
Diseñar y crear la BBDD
Escribir SQL donde haga falta leer o modificar datos
Utilizar cursores para recorrer los resultados
Con el paso del tiempo
¿Y si cambio el nombre o tipo de una columna?
¿Y si añado una tabla nueva?
¿Y si cambio BBDD local por servicios web externos?
23. Patron DAO
Data Access Object
Originario del ámbito J2EE
Aplicable a cualquier tipo de software OO
24. Patrón DAO
¿Qué es?
Interfaz con métodos de persistencia para Bussiness Objects
Independiente del mecanismo de persistencia (BBDD, XML, Servicios
Web, etc.)
Sólo entran y salen Bussiness Objects y tipos primitivos
Excepciones independientes de la persistencia
26. Patrón DAO
Beneficios e Inconvenientes
Beneficios
Separación lógica aplicación y gestión persistencia
Evolución/Migración persistencia sin cambiar lógica aplicación
Centralización de las tareas de persistencia (mejor mantenimiento)
Inconvenientes
Capa extra quizá innecesaria en aplicaciones pequeñas
Mueve objetos enteros -> Sobrecarga (si no se diseña bien)
Dificulta integración con frameworks ActiveRecord u ORM
27. Patrón DAO
Estructura habitual
Un objeto DAO por Bussiness Object/Tabla
Métodos habituales en el interfaz
List<BO> getAll() / findAll()
BO getById(Long id) / findById(Long id)
insert(BO theObject)
delete(BO theObject)
update(BO theObject)
Y todos los que hagan falta….
28. Patrón DAO
Métodos Genéricos vs Métodos Específicos
Ejemplo: Aplicación tipo Google Calendar (vista calendario + vista detalle)
Métodos genéricos
List<Event> getAllEvents()
Event insertEvent(Event e)
Event updateEvent(Event e)
Métodos genéricos
List<Event> getAllEventsWithScheduleInfo()
updateScheduleInfo(long eventId, Date start, Date end)
Event insertEvent(String title, Date start, Date end)
Event getEventWithDetailnfo()
Event updateEvent(Event e)
29. ¿Cómo cambiar de persistencia?
DAO permite varias persistencias. ¿Para qué?
Conectado vs Desconectado
Desarrollo vs Producción
Lite vs Premium
Conexión rápida vs Conexión lenta
¿Cómo cambiar entre persistencias?
UsuariosDAO usuariosDAO = new UsuariosSQliteDAO();
UsuariosDAO usuariosDAO = new UsuariosRESTDAO();
¡Disperso por toda la aplicación!
30. Patrón DAO
Abstract Factory Pattern
Factoría -> encargado de crear objetos
Agrupar y encapsular factorías individuales (una por DAO)
DAOFactory
getUsersDAO()
getProducsDAO()
<implementa>
SqliteDAOFactory
UserSqliteDAO
ProductsSqliteDAO
RestDAOFactory
getUsersDAO()
getProducsDAO()
getUsersDAO()
getProducsDAO()
UserRestDAO
ProductsRestDAO
32. Índice
¿Qué es persistencia?
Retos de la persistencia en móviles
¿Cómo diseñar la persistencia de datos?
Mecanismos de persistencia de datos en Android
SQLite
ORMLite
Parse
Servicios REST
33. Android Annotations
¿Por qué utilizarlo?
Facilitar la legibilidad del código
Evitar escribir código boilerplate
Centrarse en la lógica de la aplicación
Ocultar la complejidad técnica
34. Android Annotations
¿Qué funcionalidad simplifica?
Inyección de dependencias
§
Obtener referencias a vistas, recursos, extras, etc.
Gestión de threads
§
UI vs Background
Listeners de eventos
§
No más clases anónimas
Cliente REST
§
Interacción con servicios WEB
37. SQLite en Android
Conceptos básicos
Incluida en por defecto
Open Source → Utilizada en otros muchos proyectos
Ligera y embebida
BDs privadas de cada aplicación
Se almacenan en “/data/data/<package-name>/databases”
A tener en cuenta
No mantiene integridad de datos
No mantiene integridad referencial (foreign keys)
Se puede simular con triggers
Por defecto no tiene soporte completo a Unicode
No proporciona interfaz gráfica de administración
38. SQLite en Android
Implementación
Crear clase para administración:
Heredar de android.database.sqlite.SQLiteOpenHelper
Parámetros del constructor:
Contexto
Nombre de la DB
CursorFactory (null para utilizar el por defecto)
Versión del esquema de BBD (para tener en cuenta en migraciones)
Implementar métodos de construcción
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE "+tableName+" (_id INTEGER PRIMARY KEY , "+
colDeptName+ " TEXT)");
// More stuff including initial data
}
39. SQLite en Android
Implementación
Implementar método de migración
Parámetros del constructor:
oldVersion: versión de la bbdd en el dispositivo
newVersion: versión que se quiere alcanzar
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// do stuff
}
Desde la Actividad:
Crear instancia del DBOpenHelper
Conseguir DB
db.getWritableDatabase();
40. SQLite en Android
Interactuando con la BBDD
Consultas (Queries)
Modo “raw”:
SQLiteDatabase db=this.getReadableDatabase();
Cursor cur=db.rawQuery("SELECT "+colDeptID+" as _id,"+colDeptName+" from
"+deptTable,new String [] {});
Modo “sencillo” (API)
SQLiteDatabase db=this.getReadableDatabase();
String [] columns=new String[]{"_id",colName,colAge,colDeptName};
Cursor c=db.query(viewEmps, columns, colDeptName+"=?",
new String[]{Dept}, null, null, null);
§
§
§
Nombre tabla
Columnas
Condición WHERE
§
§
§
Argumentos del WHERE
Cláusula GROUP BY
Clásula HAVING
§
Clásulula ORDER BY
41. SQLite en Android
Interactuando con la BBDD
Insertar fila
SQLiteDatabase db=this.getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put(“colDeptID”, 1);
cv.put(“colDeptName”, "Sales");
db.insert(deptTable, “colDeptID”, cv);
cv.put(“colDeptID”, 2);
cv.put(“colDeptName”, "IT");
db.insert(“tablename”, null, cv);
db.close();
42. SQLite en Android
Operaciones con Vectores
Puntero a un conjunto de datos
Resultado de una interacción con una BBDD
Operaciones de gestión:
close()
deactivate()
requery()
Operaciones de consulta:
getInt(int column_index)
getString(int column_index)
Etc.
getColumnIndex(String
ColumnName)
Operaciones de posición:
moveToNext()
moveToFirst()
moveToPosition(int pos)
moveToLast()
isFirst()
isLast()
isBeforeFirst()
isAfterLast()
43. Índice
¿Qué es persistencia?
Retos de la persistencia en móviles
¿Cómo diseñar la persistencia de datos?
Mecanismos de persistencia de datos en Android
SQLite
ORMLite
Parse
Servicios REST
44. Object-Relational Mapping
¿Qué es un ORM?
Una técnica de programación para
convertir datos entre un sistema OO y un
sistema Relacional
47. Object-Relational Mapping
Algunas Recomendaciones
Loggea y lee las SQL que genera el ORM
Utiliza profiling para encontrar queries lentas
Añade los selects para recuperar sólo columnas necesarias
Utiliza raw SQL cuando el ORM complica las cosas
50. OrmLite
Manipular la BBDD
Instanciar el OpenHelper
Obtener un DAO para un tipo de objeto
@RootContext
Context ctxt;
Dao<SampleRow, Long> dbDAO;
@AfterInject
void initDbHelper() {
DatabaseHelper dbHelper = OpenHelperManager.getHelper(ctxt, DatabaseHelper.class);
try {
dbDAO = dbHelper.getDao(SampleRow.class);
}
catch (SQLException e) {
dbDAO = null;
}
}
51. OrmLite
Manipular la BBDD
Crear un objeto
SampleRow sampleRow = new SampleRow();
sampleRow.setCityName(“Zaragoza”);
[…]
dbDAO.create(sampleRow);
Actualizar un objeto
sampleRow.setCityName(“Huesca”);
dbDAO.update(sampleRow);
//debe tener id
Eliminar un objeto
dbDAO.delete(sampleRow);
// o también dbDAO.deleteById(sampleRow.getId());
52. Índice
¿Qué es persistencia?
Retos de la persistencia en móviles
¿Cómo diseñar la persistencia de datos?
Mecanismos de persistencia de datos en Android
SQLite
ORMLite
Parse
Servicios REST
54. Servicios Cloud
Ventajas e Inconvenientes
Ventajas
Evitar infraestructura sobredimensionada
Evitar costes de administración y mantenimiento
Distribuir costes en el tiempo
Soportar picos de necesidad
Inconvenientes
Problemas de privacidad y seguridad
Imposible adaptación/personalización
Difícil respuesta a fallos de servicio
Falta de estándares (vendor lock-in)
55. Persistencia Cloud
Ecosistema de Servicios
Acceso por SDK o API REST
Firebase Data (REST + SDK)
Parse Data (REST + SDK)
MongoDB (REST)
SimpleDB (REST + SDK)
Oracle (custom REST)
CouchDB (SDK)
56. NoSQL
¿Qué es?
Sistemas de almacenamiento de información que
no cumplen con el esquema entidad-relación
No hay consultas con SQL
No hay estructura fija
No hay JOINs
No garantizan ACID
(atomicidad, coherencia, aislamiento y durabilidad)
57. NoSQL
¿Por qué surge?
Aplicaciones Web Globales
- Grandes volúmenes
- Datos heterogéneos
- Rápida evolución de la estructura
- Acceso escalable
Nueva Infraestructura
- Grandes clústers
- Almacenamiento y computación cloud
58. NoSQL
¿Por qué surge?
Problemas de BBDD Relacionales
- No escalan bien en horizontal (distribución)
- Dificultan las evolución del esquema
Persistencia “Políglota”
- Distintas necesidades -> Distinto tipo de persistencia
- Encapsular para independizar
Datos muy estructurados
Volumen reducido
Acceso ocasional
Datos poco estructurados
Volumen muy grande
Acceso constante
60. Características NoSQL
Principales tipos de BBDD NoSQL
Clave->Valor
- Como un map enorme
- Particionado sencillo por clave
Document Store
- Mapas anidados con listas
- Permiten “consultas” del contenido
Big Table
- Filas y columnas
- “Familias” de columnas dinámicas
BBDD Grafos
- Nodos, propiedades y aristas
- Permiten consultas complejas
61. NoSQL
Ventajas e Inconvenientes
Ventajas
Estructura adecuada para algunos datos
Mejor escalabilidad
Más flexibilidad de la estructura de datos
Inconvenientes
Aplicaciones más complejas
Falta de estandarización/formación
Integración estrategias persistencia
62. Parse
Conceptos Básicos
Parse Data
- Parte de suite de servicios para desarrollo de apps
- Notificaciones PUSH, Identificación, Analíticas…
Instalación
1.- Descargar JAR e incluir
2.- Inicializar librería
Parse.initialize(this, APP_CODE, API_KEY);!
63. Parse
Manipular datos
Guardar datos
ParseObject parseObject = new ParseObject("Note");!
parseObject.put("title",note.getTitle());!
parseObject.put("text",note.getText());!
parseObject.put("category",ParseObject.createWithoutData("Category",note.getCategory().getId()));!
!
Consultas
ParseQuery<ParseObject> query = ParseQuery.getQuery("Note"); !
for (ParseObject parseObject : query.find()) { …. }!
!
ParseObject parseObject = query.get(noteToEditId);!
64. Índice
¿Qué es persistencia?
Retos de la persistencia en móviles
¿Cómo diseñar la persistencia de datos?
Mecanismos de persistencia de datos en Android
SQLite
ORMLite
Parse
Servicios REST
65. REST
¿Qué es?
El Representational State Transfer (REST)
es un estilo arquitectónico para sistemas
software distribuidos basado en
RECURSOS
71. REST
Conexión HTTP manual
q Leer un stream
String getURL = “http://nombredelservidor.com/services/clientes/”+clienteId;
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
int response = conn.getResponseCode();
is = conn.getInputStream();
JSONObject clienteJsonObject = new JSONObject(is.toString());
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(clienteJsonObject, Cliente.class);
72. REST
Con Android Annotations
q Definir una interfaz
@Rest(rootUrl = "http://nombredelservidor.com/services/",converters =
{ MappingJacksonHttpMessageConverter.class })
public interface ClientesClient {
@Get(”clientes/{clientId}")
Client getClienteById(String clientId);
}
73. Mecanismos de Persistencia en Android
Conclusiones
La persistencia es un detalle (importante)
Varias opciones/tecnologías de implementación
Elija una, pero no hipoteques tu futuro
74. Mecanismos de Persistencia en Android
Javier Muñoz Ferrara
jmunoz@grupogimeno.com
http://twitter.com/jmunozf
http://www.linkedin.com/in/javiermf