Hai un’applicazione iOS non aggiornata e stai cercando il modo per aggiungere il Core Data ad un progetto esistente?

Anche io, come te, mi sono posto questo problema e cercando un po’ su internet e analizzando i progetti creati da Xcode sono venuto alla seguente conclusione: perché Xcode non ha un bel bottone “inserisci Core Data” se il codice è pressoché uguale per tutti? Boooh!

Nel frattempo che aspettiamo che a Cupertino qualcuno trovi una risposta a questa domanda, ti lascio i 2 step da seguire per implementare il Core Data in un progetto Xcode già creato.

#1 Aggiungere il DataModel

Nella barra in alto di Xcode, crea un nuovo file da File\New\File…, seleziona iOS, Core Data e Data Model. Premi next. Dai un nome al file (Save as) e premi create. In genere il nome del Data Model è uguale a quello del progetto.

#2 Modificare l’AppDelegate.swift ed aggiungere le referenze del CoreData

Apri il file appDelegate.swift e sotto l’import dell’UIKit, aggiungi l’import al Core Data:

import UIKit
import CoreData

Il passo successivo è quello di aggiungere una proprietà di tipo PersistentContainer, che gestirà il collegamento tra il tuo DataModel ed i dati presenti nell’ManagedObjectContext, ed un metodo saveContext() che è quello che utilizzi per salvare le modifiche che effettuerai al tuo Context.

Nel codice che vedrai qui di seguito, sostituisci alla parol “NomeApp”  il nome del progetto della tua applicazione.

Sotto tutti i metodi dell’AppDelegate, aggiungi il seguente codice:

lazy var persistentContainer: NSPersistentContainer = {
    /*
     The persistent container for the application. This implementation
     creates and returns a container, having loaded the store for the
     application to it. This property is optional since there are legitimate
     error conditions that could cause the creation of the store to fail.
    */
    let container = NSPersistentContainer(name: "NomeApp")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
             
            /*
             Typical reasons for an error here include:
             * The parent directory does not exist, cannot be created, or disallows writing.
             * The persistent store is not accessible, due to permissions or data protection when the device is locked.
             * The device is out of space.
             * The store could not be migrated to the current model version.
             Check the error message to determine what the actual problem was.
             */
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

L’ultimo passaggio da fare è quello di modificare il metodo applicationWillTerminate, che è già presente tra i metodi dell’appDelegate, aggiungendo la chiamata alla saveContext:

func applicationWillTerminate(_ application: UIApplication) {
    self.saveContext()
}

Considerazioni

Altri metodi più semplici, per aggiungere il Core Data ad un progetto esistente, di questo io non ne conosco. L’altro sarebbe quello di ricreare un progetto da zero, ma sai benissimo cosa significa :D

Dove andare da qui

Dato che si parla di core data, i prossimi tutorial che ti consiglio di leggere sono:

Buona Programmazione!

Changelog

  • 3/01/2016 – Aggiunto il changelog. Modificato il codice per supportare Xcode 8 e Swift 3.