Automatische Migration in CoreData aktivieren

Laut der offiziellen Apple Dokumentation ist die Nutzung von CoreData die bevorzugte Variante um Daten auf dem iPhone oder dem iPad zu persistieren und selbst, wenn es zu MySQL bzw. genauer gesagt zu SQLite einige Parallelen gibt, handelt es bei CoreData nicht um eine Datenbank im eigentlichen Sinne.

Das bedeutet natürlich auch, dass wir bei der Nutzung von CoreData viele Dinge einfach grundsätzlich anders händeln müssen, als wenn wir direkt in einer Datenbank arbeiten würden. Besonders deutlich wird dieses Problem immer dann, wenn sich im Laufe des Entwicklungszyklus das Datenschema der Anwendung grundlegend verändert.

Während wir beispielsweise bei MySQL die Tabellenstruktur beim Benutzer durch eine Reihe von „Update-Queries“ auf den aktuellen Stand bringen können, sieht man bei einer CoreData Applikation immer wieder, dass gerade Einsteiger nach einer Änderung der Entiäten oder nach einer Erweiterung der Properties gern mal die gesamte Anwendung auf dem iPhone bzw. iPad zurücksetzen.

Das mag zwar bei der Entwicklung im Simulator alles noch relativ problemlos möglich sein, aber spätestens wenn wir eine Anwendung nicht nur von einem selbst, sondern auch von wirklichen Kunden genutzt wird, müssen andere Lösungen her, denn schließlich möchten wir uns die Nutzer nicht dadurch vergraulen, dass sie nach jedem Update alle Daten erneut in der App speichern müssen.

Aber auch hier lohnt mal wieder ein Blick in die offizielle Dokumentation, denn Apple beschreibt auf zahlreichen Seiten sehr eindrucksvoll welche Möglichkeiten bestehen um ein bestehendes Datenschema beim Nutzer zu aktualisieren. Letztendlich dürfte es aber in sehr vielen Fällen bereits vollkommen ausreichen, wenn man lediglich die automatische Migration für den persistentStoreCoordinator aktiviert und dazu müssen im Prinzip nur wenige Zeilen im AppDelegate geändert werden:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    
    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }
    
    NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"name.sqlite"]];
    NSError *error = nil;
    
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
        [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
	
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    
    
    return persistentStoreCoordinator_;
}

Dem geübten Entwicklerauge wird jetzt natürlich sofort auffallen, dass wir in den Zeilen 10 bis 12 lediglich ein neues NSDictionary mit zusätzlichen Parametern für unseren persistentStoreCoordinator erstellen. Und das soll es schon gewesen sein?

Im Prinzip schon, denn jetzt müssen wir das NSDictionary in Zeile 15 lediglich noch an unseren persistentStoreCoordinator übergeben und schon ist unsere CoraData Applikation in der Lage eine automatische Aktualisierung durchzuführen.

Damit CoreData aber überhaupt eine Migration durchführen kann, muss das System natürlich sowohl den alten Stand, als auch den aktuellen Stand kennen und daher müssen wir nun noch eine Kopie unseres Datenmodels in XCode angelegen.

Aktivieren Sie dazu bitte zunächst im XCode Projektbaum ihr *.xcdatamodel und wählen Sie anschließend den Menüpunkt Design > Data Model > Add Model Version aus. XCode legt nun vollautomatisch eine Kopie Ihres Datenobjektes an und genau in dieser Kopie führen Sie nun die gewünschten Änderungen an den Entitäten durch.

Sobald Sie damit fertig sind, aktivieren Sie bitte die soeben erstellte Kopie Ihres Datenmodels im XCode Projektbaum und wählen anschließend den Menüpunkt Design > Data Model > Set Current Version um diese als aktuelle Version zu kennzeichnen.

Nun sind alle Vorarbeiten erledigt und CoreData kennt sowohl die alte, als auch die neue Version Ihres Datenmodels. Beim nächsten Start wird das System uns nun nicht mehr mit einer unschönen Fehlermeldung begrüßen, sondern die CoreData wird wie von Geisterhand versuchen, die vorhandenen Strukturen zu aktualisieren.

1 comment for “Automatische Migration in CoreData aktivieren

  1. Oliver
    8. März 2012 at 19:09

    Super beschrieben!

    Vielen Dank, genau das was ich gerade gesucht habe!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.