2013-04-19 9 views

Antwort

21

Wenn Sie Attribute in Ihrem vorhandenen Code-Datenmodell ändern wollen, dann müssen Sie ein paar Schritte folgen ... finden Sie in diesem customizing-core-data-migrations

Oder diese würde Ihnen helfen viel how-to-perform-a-lightweight-core-data-migration

+0

Es half, danke! –

+12

Bitte vermeiden Sie, mit URLs zu antworten, oder fügen Sie die Highlights, die die Frage beantworten, zumindest ein. Sie können nicht garantieren, dass ein externer Link immer da ist ... – dooleyo

+1

Und in der Tat ist die erste Verbindung tot - Bad Gateway. – rattletrap99

4

Wenn Sie einer Entität nur Attribute hinzufügen, können Sie das automatisierte lightweight migration in Core Data verwenden.

Grundsätzlich müssen Sie nur eine NSDictionary Instanz mit den entsprechenden Optionen übergeben, wenn Sie den persistenten Speicher hinzufügen. Hier ist ein Code-Schnipsel aus dem Ende eines Accessormethode für _persistentStoreCoordinator:

NSNumber *optionYes = [NSNumber numberWithBool:YES]; 
NSDictionary *options = [NSDictionary dictionaryWithObjects:@[optionYes] forKeys:@[NSMigratePersistentStoresAutomaticallyOption]]; 
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 
    NSLog(@"Error opening persistent store: %@, %@", error, [error userInfo]); 
    abort(); 
} 
return _persistentStoreCoordinator; 

Wenn die Migration für eine leichte Migration zu komplex ist, werden Sie eine Fehlermeldung. Andernfalls sollte die Migration ausgeführt werden und Ihre Datenbank wird aktualisiert, damit sie mit Ihrem neuen Schema übereinstimmt.

Beachten Sie, dass Sie, wenn Sie dies wirklich auf einem Gerät tun, Ihre .sqlite-Datei zuerst sichern sollten, falls bei der Migration etwas schief geht.

2

Also mein Problem war ich hatte keine Ahnung, wo dieser beständige Speicher-Koordinator-Code geht. Es stellt sich heraus, dass es automatisch in Ihrer AppDelegate Implementierung erstellt wird, wenn Sie beim Erstellen des Projekts "Core Data verwenden" aktivieren.

Also, aus dem zweiten Glied here, alles was Sie brauchen für eine leichte Migration tun (das Hinzufügen neuer Attribute und so weiter) ist die folgende:

  1. Wählen Sie .xcdatamodeld
  2. aus dem Menü Wählen Sie Editor -> Modellversion hinzufügen
  3. Benennen Sie die neue Version wie gewünscht, wählen Sie die frühere Version in "Basierend auf Modell"
  4. Wählen Sie im Dateiinspektor des .xcdatamodel Modellversion -> Aktuell -> Ihr neues Modell Version
  5. Wählen Sie Ihre neue Modellversion innerhalb des .xcdatamodeld im Projektnavigator aus, und nehmen Sie die Änderungen an Ihrem Modell vor.
  6. Wenn Sie Attributnamen oder Typen geändert haben, erstellen Sie ein Zuordnungsmodell, neue Datei -> Core Data -> Mapping Model -> Pick Quell- und Zielmodellversionen
  7. aktualisiert die Zuordnung in dem neuen Mapping-Modell

ändern AppDelegate persistenten Speicher Koordinator Code wie folgt.

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { 
    var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("<data model name>.sqlite") 
    var error: NSError? = nil 
    var failureReason = "There was an error creating or loading the application's saved data." 
    let options = [ 
    NSMigratePersistentStoresAutomaticallyOption: true, 
    NSInferMappingModelAutomaticallyOption: true] 
    if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options, error: &error) == nil { 
     coordinator = nil 
     // Report any error we got. 
     var dict = [String: AnyObject]() 
     dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" 
     dict[NSLocalizedFailureReasonErrorKey] = failureReason 
     dict[NSUnderlyingErrorKey] = error 
     error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) 
     // Replace this with code to handle the error appropriately. 
     // abort() 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. 
     NSLog("Unresolved error \(error), \(error!.userInfo)") 
     abort() 
    } 

    return coordinator 
}() 

hinzufügen So Optionen Migration Sie nur auf den addPersistentStoreWithType Anruf.

Verwandte Themen