Post on 27-Aug-2020
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2012-13 Depto. Ciencia de la Computación e IA
Persistencia
Sesión 4: Persistencia en iOS. User Defaults y Core Data
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Índice de contenidos
• User Defaults• Introducción• Escritura• Lectura• Preferencias de aplicación
• Core Data• Introducción• Componentes para la gestión de datos• Componentes para consultas• Migración de datos.
2
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
User Defaults• Útil para almacenar datos simples y de uso repetido.• Uso muy similar a las variables de sesión en Web.• Los datos se almacenan en la memoria del dispositivo (no en
fichero ni BD) -> Acceso a datos instantáneo (muy rápido)• Los datos se borran al borrar la aplicación (al igual que el resto
de métodos de persistencia).• Muy sencillo de programar (Key-Value)
• Ejemplos de uso:• Información de usuario: nombre de usuario.• Estado actual de la aplicación.• Puntuación almacenada en un juego.• Nivel actual en un juego.
3
-(IBAction) guardaDatos { NSLog(@"Guardamos los datos..."); // creamos el objeto NSUserDefaults NSUserDefaults *datos = [NSUserDefaults standardUserDefaults]; // guardamos el nombre (NSString) [datos setObject:tfNombre.text forKey:@"nombre"]; // guardamos la edad (Integer) [datos setInteger:[tfEdad.text integerValue] forKey:@"edad"]; }
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
User Defaults: escritura• Uso de la clase NSUserDefaults
• Escritura de datos:
4
NSUserDefaults *datos = [NSUserDefaults standardUserDefaults]; // obtenemos un NSString NSString *nombre = [datos stringForKey:@"nombre"]; // obtenemos un NSInteger NSInteger edad = [datos integerForKey:@"edad"]; if (nombre!=nil && edad!=0){ NSLog(@"Nombre cargado: %@, edad: %d",nombre,edad); } else { NSLog(@"Sin datos!"); }
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
User Defaults: lectura• Lectura de datos:
5
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Preferencias de la aplicación• Podemos personalizar las preferencias de nuestra aplicación
mediante un fichero Settings.• Las preferencias que creemos en el fichero aparecerán dentro
de los ajustes de nuestro dispositivo.• El fichero Settings es de tipo plist en el que cada elemento es
un diccionario.• Muy útil para configurar parámetros de configuración, como por
ejemplo:• Unidades de medida (km, millas...).• Tamaño de letra de los textos.• Mostrar número de versión de la aplicación.• Mostrar información sobre el desarrollador.• Filtros para listados (por ejemplo en aplicaciones de RSS).• etc.
6
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Pantalla de preferencias
7
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Creando un fichero de preferencias (1)• Seleccionamos: File > New File > Settings > Settings Bundle
8
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Creando un fichero de preferencias (2)• Fichero de tipo plist:
9
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Creando un fichero de preferencias (3)• Valores permitidos para la propiedad Type:• PSTextFieldSpecifier: Campo de texto.• PSTitleValueSpecifier: Campo título (sólo lectura).• PSToggleSwitchSpecifier: Campo ON/OFF (booleano)• PSSliderSpecifier: Valor númerico en una escala. Tiene
máximo y mínimo.• PSMultiValueSpecifier: Listado de valores entre los que
podemos elegir.• PSGroupSpecifier: Grupo de propiedades.• PSChildPaneSpecifier: Botón que abrirá otra ventana de
propiedades (otro plist).
10
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Lectura de valores de preferencias• Los valores de las preferencias se almacenan como
preferencias de usuario (NSUserDefaults) y podemos acceder a ellos desde cualquier parte de nuestro código:
11
NSString *textValue = [[NSUserDefaults standardUserDefaults]
stringForKey:@”clave_de_la_propiedad”];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Índice de contenidos
• User Defaults• Introducción• Escritura• Lectura• Preferencias de aplicación
• Core Data• Introducción• Componentes para la gestión de datos• Componentes para consultas• Migración de datos.• Magical Record
12
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Introducción (1)• Framework para la gestión de datos relacionales.• Disponible a partir del SDK 3.0 de iPhone.• Útil para aplicaciones con modelos de datos complejos.• Optimiza el consumo de memoria y mejora el tiempo de
respuesta con respecto a otros métodos de persistencia.• Usa una base de datos SQLite como método de
almacenamiento interno.• Básicamente, la API de Core Data permite interactuar con
SQLite (ORM):• Sin preocuparnos por las conexiones a la BD.• Sin preocuparnos por el esquema de la BD.• Sin escribir una sola línea de código para interactuar con SQLite.
13
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Introducción (2)• Elimina el tiempo de desarrollo innecesario de escribir
sentencias SQL complejas y la gestión de sus resultados.• Plantillas de XCode adaptadas a Core Data.• Preparado para migraciones entre versiones.• Desde iOS5: ¡nueva API para usar junto a iCloud!
14
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Preparando la aplicación (1)• Seleccionar opción de usar Core Data al crear un proyecto en
XCode:• Nos incluirá el Framework de Core Data.• Nos creará el código básico de acceso a datos.• Nos creará el modelo de datos: appname.xcdatamodel
• En el fichero del modelo de datos definiremos el esquema de la Base de Datos de modo visual.• En el modelo incluiremos las tablas, atributos de tabla y
relaciones.• No hace falta incluir claves primarias, ya que Core Data las
gestionará por nosotros.• A partir del modelo de datos se creará internamente el fichero
SQLite.
15
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Preparando la aplicación (2)• Entity o Managed Object: • Corresponde a una tabla en la
BD. • Es un objeto que contendrá
datos.
• Attributes (Atributos):• Corresponden a las columnas de
la BD.• Pueden ser datos o relaciones
entre entidades.
16
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Componentes (1)
17
NSManagedObject
NSManagedObjectContext
NSManagedObjectModel
NSPersistentStoreCoordinator
NSPersistentObjectStore
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Componentes (2)• NSManagedObject:• Es una representación de un registro de una tabla de la base de
datos.• Ej.: Tabla de personas, cada persona será un ManagedObject.• Siempre está asociado con un ManagedObjectContext.• Se pueden crear subclases del NSManagedObject o podemos
acceder a sus atributos a través de KVO (Key-Value Observing), como un NSDictionary.
• Cualquier cambio que se haga (inserción, borrado o cambio de propiedades) se mantendrá en memoria en el ManagedObject hasta que se guarde el contexto (ObjectContext).
18
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Componentes (3)• Opcionalmente podemos crear subclases del NSManagedObject:• Seleccionamos el esquema de datos > File > New File > “Managed Object Class”.
• Podemos modificar las clases a nuestro gusto, por ejemplo añadiendo nuevos métodos.
• Recomendado para facilitar el uso del ManagedObject en nuestro proyecto.
19
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Componentes (4)• NSManagedObjectContext:• El encargado de gestionar los datos de la base de datos
(ManagedObjects)Ejecuta las consultas, borrados, actualizaciones, inserciones,
etc...
20
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Componentes (5)• NSManagedObjectModel:• Es el modelo de datos.• Un conjunto de entidades (ManagedObject).• Permite definir relaciones entre entidades.• Se crea a través de XCode de modo visual (fichero .xcdatamodel).
21
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Componentes (6)• NSPersistentStoreCoordinator:• Gestiona una colección de PersistentObjectStores.• No se interactúa de forma directa.
• NSPersistentObjectStore:• Es el repositorio externo (SQLite).• No se interactúa de forma directa.
22
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Consultas (1)• Esquema de funcionamiento de las consultas (FetchRequest):
23
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Consultas (2)• NSFetchRequest:• Es una consulta de ManagedObjects sobre un ManagedObjectContext. (Equivale a una Select)
• Podemos usar predicados para hacer filtros: NSPredicate.• Podemos usar descriptores para ordenar los datos: NSSortDescriptor.
• El resultado de un FetchRequest será un array de ManagedObjects.
• NSFetchedResultsController:• Controlador que permite que la aplicación funcione de forma
semiautomática cuando hay cambios en los datos de Core Data.• Muy útil cuando trabajamos con tablas (UITableView).
24
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Consultas (3)• Ejemplo: Aplicación “Viajes”.
Si creamos un nuevo viaje:1) Creamos un objeto de tipo NSManagedObject y
escribimos datos en él (título del viaje, descripción, fecha, etc..).
2) Añadimos el objeto NSManagedObject a una instancia de la clase NSManagedObjectContext.
3) Ejecutamos el método “save” del NSManagedObjectContext.
4) Creamos un FetchRequest para cargar todos los viajes.
5) Ahora, automáticamente gracias a los métodos del protocolo del NSFetchedResultsController, podremos actualizar la vista con los nuevos datos.
25
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Migración de datos (1)• ¿Qué pasa si en un momento dado cambiamos la estructura del
modelo de datos?• ¿Cómo se migran los datos que ya estaban en la base de datos
al nuevo modelo de datos?
• Dos formas de implementar una migración de datos:• 1) Si la app está en fase de desarrollo:
Borramos la aplicación y la volvemos a ejecutar -> Se volverá a crear el modelo de base de datos.
Los datos se perderán -> No importa porque estamos en una versión de desarrollo.
26
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Core Data: Migración de datos (2)• 2) Si la app ya está en producción:
Modo “Versioning” de XCode: Implementación sencilla para realizar la migración de datos simples (lightweigh migration).
Se complica bastante si tenemos que realizar migraciones de datos a medida -> implementación propia.
Recomendado: revisar la documentación de Apple si necesitamos implementar migraciones:
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmVersioning.html#//apple_ref/doc/uid/TP40004714-SW1
27
¡ATENCIÓN! Si realizamos algo mal podemos hacer que el usuario pierda todos los datos cuando actualice la aplicación.
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
Magical Record• Librería que encapsula todo el código de implementación de
Core Data.• Facilita enormemente el uso de Core Data en nuestras
aplicaciones.• Instalación muy sencilla.• Recomendado su uso.
• https://github.com/magicalpanda/MagicalRecord
28
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Persistencia en iOS © 2012-13 Depto. Ciencia de la Computación e IA Persistencia
¿Preguntas?
29