Crear el stack de Core Data en iOS

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.

Salvo que tengamos necesidades especiales no es necesario escribir el código de inicialización manualmente, 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 NSPersistentContainer que simplifica considerablemente el código con respecto a las versiones anteriores.

lazy var persistentContainer: NSPersistentContainer = {
   let container = NSPersistentContainer(name: "PruebaCoreData")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
             fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

// MARK: - Core Data Saving support
func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}

Básicamente, esta es la clase que centraliza todo el manejo de Core Data. Nos permite acceder al NSManagedObjectContext, mediante su propiedad viewContext. Esto, que es lo que se denomina 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 los objetos pendientes en el contexto de forma simple.

También puedes añadir soporte de Core Data a cualquier proyecto ya creado, aunque no lo crearas marcando la casilla "use core data". Simplemente se trata de añadir manualmente el fichero del modelo de datos y también el código de Core Data en el AppDelegate. Para todos los detalles, puedes seguir por ejemplo las instrucciones de este tutorial.