jueves, 4 de abril de 2013

iOS: ¿Qué es Core Data?


Mac OSX 10.4 Tiger introdujo Core Data para proporcionar una estructura (framework) unificada para guardar y recuperar los datos del modelo de una aplicación. Posteriormente, esta estructura se extendió a los dispositivos con sistema operativo iOS desde su versión 3.0.

Core Data tiene sus inicios en EOF (Enterprise Object Framework) que NeXT desarrolló como parte de WebObjects y que se usaba para acceder a un sistema de bases de datos relacional como por ejemplo era SQLite para iOS. Esta forma de trabajar ayuda a que el acceso a base de datos para obtener un registro sea a través de objetos que se mapean con la tabla. De este EOF, se evolucionó a lo que es ahora Core Data.

Core Data no representa a una base de datos ni a una estructura de acceso a datos. Es una solución completa de modelo de datos que permite diseñar virtualmente un gráfico de objetos, codificar la creación  y consulta de objetos en dicho gráfico y codificar para que los objetos persistan en disco.

En definitiva, esta estructura proporciona un medio muy rápido para acceder a los datos del modelo.

¿Qué nos permite hacer Core Data en iOS?


Entre otras cosas, las ventajas más relevantes del uso de este framework es la administración de relaciones, que pueden llegar a tener incluso reglas.

Nos permite trabajar con objetos administrados (managed objects) que contiene el control de relaciones y la validación de datos sobre sus atributos o propiedades.

Nos permite crear reglas para los objetos, como por ejemplo que el número de interconsultas de un paciente no sea superior a 5.

Componentes del Core Data



Modelo Core Data

Managed Objects

Instancia o subclase de NSManagedObject. Representa un registro en una base de datos.

Las subclases pueden ser generadas automáticamente una vez que definimos nuestro modelo de datos.

Managed Object Context

Es una instancia de NSManagedObjectContext y su función es administrar colecciones de Managed Objects.

Todas las operaciones de alta, baja y modificación las vamos a hacer a través del Managed Object Context.

Implementa otras funcionalidades como las validaciones.

Managed Object Model

Es una instancia de NSManagedObjectModel. Representa al modelo de datos, básicamente es una colección de entidades que definen los Managed Objects, donde cada entidad esta compuesta principalmente por atributos. La descripción de la entidad esta definida en la clase NSEntityDescription.

Cada Managed Object tiene una referencia a una instancia de NSEntityDescription. Es posible definir relaciones entre las entidades y consultas (Fetched properties).

El modelo de datos lo podemos crearemos desde XCODE con los archivos *.xdatamodeld.

MUY IMPORTANTE: Si cambiamos el modelo una vez que la aplicación ya esta funcionando, la aplicación no va a reconocer los datos guardados con el modelo anterior.

Persistent Store Coordinator


Es una instancia de NSPersistenStoreCoordinator. Básicamente maneja una colección de Persistent Object Stores y no se suele interactuar de forma directa con él.

Persistent Object Store

Representa un repositorio externo (Por lo general SQLite). Hay distintas clases de Persistent Object Store que representan las distintas formas de almacenar la información. Podemos implementar nuestro propia Persistent Object Store si lo deseamos.

Fetch Request

Es una instancia de NSFetchRequest, y representa un búsqueda de Managed Objects sobre un Managed Object Context. Podemos traer todos los elementos simplemente definiendo el nombre de la entidad, también podemos especificar filtros (NSPredicate), el orden de los datos (NSSortDescriptor).

El resultado de la ejecución de un Fetch Request va a ser un array de Managed Objects.

Fetched Results Controller


Fetched Results Controller (NSFetechedResultController)  optimiza el uso de memoria. Con este controller podemos además definir el criterio de agrupación (útil para mostrar datos agrupados en UITableView) y paginación.