El stack de Core Data
Last updated
Was this helpful?
Last updated
Was this helpful?
Vamos a introducir las funcionalidades básicas de Core Data implementando una pequeña aplicación para almacenar y listar notas de texto.
Lo primero que necesitamos para poder trabajar con Core Data es inicializar su stack, es decir instanciar las clases y crear los archivos de configuración necesarios para poder almacenar y recuperar objetos persistentes.
Para comenzar a hacer pruebas no es necesario escribir este código de inicialización, Xcode lo puede hacer por nosotros. Para ello, hay que marcar la casilla de "Use Core Data" que aparece al crear un nuevo proyecto de Xcode, tras elegir la plantilla. Crea un nuevo proyecto NotasCoreData
usando como plantilla *Single View App y asegúrate de que en la segunda pantalla del asistente de creación marcas la opción de "Use Core Data".
Marcar esta casilla tiene dos efectos:
Crea un archivo con el mismo nombre del proyecto y extensión .xcdatamodeld
donde se va a almacenar nuestro modelo de datos
Incluye una serie de métodos auxiliares en la clase AppDelegate
para ayudarnos a trabajar con Core Data sin tener que escribir código partiendo de cero, ya que la parte de inicialización es algo tediosa, o al menos lo era hasta iOS 10.
Reconociendo que la inicialización del stack era laboriosa, desde iOS 10 Apple la ha encapsulado en una nueva clase que simplifica considerablemente el código. Por eso hay dos variantes en el stack: el caso en que podamos compilar para iOS 10 o posterior y el caso en que necesitemos mantener la compatibilidad con versiones anteriores
El código que genera automáticamente Xcode no es apropiado para los casos más complejos, en los que necesitemos por ejemplo gestionar la concurrencia. Tampoco parece muy adecuado el sitio donde se inserta el código, en la clase
AppDelegate
, sería mejor tenerlo en una clase aparte. No obstante nos vale para empezar a trabajar con el API sin preocuparnos por el momento de escribir nosotros el código.
Como podemos ver, el código de inicialización en este caso es muy simple (se han eliminado los comentarios)
Básicamente, la clase que centraliza todo el manejo de Core Data es NSPersistentContainer
. Es la que nos permite acceder al NSManagedObjectContext
, mediante su propiedad viewContext
. El contexto de persistencia es lo que necesitaremos para guardar y recuperar objetos. La función saveContext
es una función de conveniencia para poder guardar el contexto de forma simple.
En Xcode 8 no existe la opción para generar el código de inicialización de Core Data sin usar los APIs de iOS 10. Sin embargo en Xcode 7 sí, y aquí tenemos el código generado. Podemos usar este código para nuestros proyectos en Xcode 8 que tengan como target iOS 9 o inferior.
Vemos que entre las propiedades creadas hay una instancia del NSManagedObjectContext
. Recordemos que esta es la principal clase con la que va a interactuar nuestro código, y la usaremos cuando queramos recuperar objetos persistentes, crear nuevos, guardar los que tenemos,... De hecho tenemos un método saveContext
precisamente para guardar los objetos de forma más cómoda.
Además del contexto, tenemos propiedades para acceder al NSPersistentStoreCoordinator
y al NSManagedObjectModel
, pero como ya hemos dicho, las usaremos de manera menos habitual.
Para ver las dependencias entre clases de Core Data podemos ir a lo que sucede cuando solicitamos la instancia del NSManagedObjectContext
, que como hemos dicho varias veces va a ser la clase de uso más habitual en nuestro código. Al ser una propiedad lazy
, si es la primera vez que accedemos a ella:
Se accede al NSPersistentStoreCoordinator
. Al ser este también lazy
, si el coordinador no ha sido todavía inicalizado
Para inicializar el coordinador necesitamos el modelo de objetos (el NSManagedObjectModel
. El modelo de objetos, a su vez, se inicializa con el recurso nombre_del_proyecto.momd
. Este recurso se genera automáticamente a partir del archivo xcdatamodeld
, y como hemos dicho es una especie de versión "binaria" o "compilada" del modelo.
Obtenido el modelo, se puede inicializar el coordinador, especificando, entre otras cosas
El tipo de almacenamiento de persistencia en el parámetro ofType
. En nuestro caso SQLite (NSSQLiteStoreType
)
La URL donde reside el almacenamiento en el parámetro at
, en nuestro caso el directorio Documents
Se inicializa el NSManagedObjectContext
simplemente llamando a un inicializador
Se asocia el coordinador al contexto, asignando el coordinador creado a la propiedad persistentStoreCoordinator
del contexto