core data migration

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • core data migration

    Hallo zusammen,

    da in meiner neuen app version ein neues attribute in core data erscheinen soll, habe ich mir diese Anleitung bezüglich migration durchgelesen und Schritt für Schritt durchgeführt:
    jamesonquave.com/blog/core-data-migrations-swift-tutorial/

    Aktuell habe ich Version 1.0 installiert, in der schon einige Daten im Core Data stehen
    Wenn ich jetzt auf 1.1 update ( welches das Core Data in v1 und v2 vorliegen hat) klappt der Start der App auch ohne Probleme / Fehler
    Ich kann auch problemlos Daten hinzufügen.

    Allerdings sind meine ganze vorherigen CoreData Einträge (aus version 1.0) nicht mehr da.
    habe ich etwas vergessen??
  • natürlich angepasst.

    zusammenfassung:
    meine Anpassung im AppDelegate

    C-Quellcode

    1. lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
    2. var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    3. let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("CoreData.sqlite")
    4. var error: NSError? = nil
    5. var failureReason = "There was an error creating or loading the application's saved data."
    6. let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
    7. do {
    8. try coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions)
    9. } catch { }
    10. return coordinator
    11. }()
    Alles anzeigen

    habe die kategorie ergänzt, welche mit dem neuen CoreData erscheint

    Quellcode

    1. class ITEMS: NSManagedObject {
    2. @NSManaged var produktname: String
    3. @NSManaged var kategorie: String
    4. }


    ähnlich wie hier siehts bei mir jetzt auch aus:
    [Blockierte Grafik: http://jamesonquave.com/blog/wp-content/uploads/twoVersions.png]




    Die Namen lautet bei mir nur anders:


    CoreData
    -> CoreDataV2
    -> CoreData
  • Ich hab das nie selbst machen müssen. Das hat die Migration gemacht.

    Vorgehensweise:
    1. xcdatamodeld anklicken und Editor -> Add Model Version und Namen vergeben
    2. dann hast du eine neue Version in der Liste (bei dir CoreDataV2)
    3. im File Inspector bei Model Version die ALTE Version aktiv lassen (CoreData bei dir)
    4. Im Project Navigator die NEUE Version anklicken und dort Attribute / Entities oder was du auch brauchst hinzufügen ( CoreDataV2 )
    5. dann erst die Model Version auf die neue Version umstellen ( auf CoreDataV2)
    6. einmal die App starten und die Daten sind im neuen Model drin

    Danach kannst du dann im Code alles ändern, was du für das neue Model brauchst. Und auf jeden Fall vor solchen Aktionen IMMER committen und evtl. auf remote pushen, damit du im Notfall zurück kannst.
    Es gibt zwei Dinge, die sind unendlich. Das Universum und die menschliche Dummheit. Wobei beim Universum bin ich mir nicht sicher - Albert Einstein
  • habe ich jetzt so gemacht. bekomme nach dem ersten start, viele Fehler:

    CoreData: error: -addPersistentStoreWithType:SQLite configuration:(null) URL:file:///var/mobile/Containers/Data/Application/699A0E1B-3CA9-4896-A91F-EA6C561DE1CB/Documents/CoreData.sqlite options:{NSInferMappingModelAutomaticallyOption = 1;
    NSMigratePersistentStoresAutomaticallyOption = 1;
    } ... returned error Error Domain=NSCocoaErrorDomain Code=134110 "Bei der Migration des dauerhaften Speichers ist ein Fehler aufgetreten." UserInfo={sourceURL=file:///var/mobile/Containers/Data/Application/699A0E1B-3CA9-4896-A91F-EA6C561DE1CB/Documents/CoreData.sqlite, reason=Cannot migrate store in-place: Validation error missing attribute values on mandatory destination attribute, destinationURL=file:///var/mobile/Containers/Data/Application/699A0E1B-3CA9-4896-A91F-EA6C561DE1CB/Documents/.CoreData.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3, NSUnderlyingError=0x15d68ba60 {Error Domain=NSCocoaErrorDomain Code=134110 "Bei der Migration des dauerhaften Speichers ist ein Fehler aufgetreten." UserInfo={entity=LM_ITEMS, attribute=kategorie, reason=Validation error missing attribute values on mandatory destination attribute}}} with userInfo dictionary {
    NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=134110 \"Bei der Migration des dauerhaften Speichers ist ein Fehler aufgetreten.\" UserInfo={entity=LM_ITEMS, attribute=kategorie, reason=Validation error missing attribute values on mandatory destination attribute}";
    destinationURL = "file:///var/mobile/Containers/Data/Application/699A0E1B-3CA9-4896-A91F-EA6C561DE1CB/Documents/.CoreDate.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3";
    reason = "Cannot migrate store in-place: Validation error missing attribute values on mandatory destination attribute";
    sourceURL = "file:///var/mobile/Containers/Data/Application/699A0E1B-3CA9-4896-A91F-EA6C561DE1CB/Documents/CoreData.sqlite";
    }
    2015-10-31 14:51:53.887 CoreData[576:299941] CoreData: error: Illegal attempt to save to a file that was never opened. "This NSPersistentStoreCoordinator has no persistent stores (schema mismatch or migration failure). It cannot perform a save operation.". Last recorded error = Error Domain=NSCocoaErrorDomain Code=134110 "Bei der Migration des dauerhaften Speichers ist ein Fehler aufgetreten." UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/699A0E1B-3CA9-4896-A91F-EA6C561DE1CB/Documents/CoreData.sqlite} / {
    NSFilePath = "/var/mobile/Containers/Data/Application/699A0E1B-3CA9-4896-A91F-EA6C561DE1CB/Documents/CoreData.sqlite";
    }
    2015-10-31 14:51:53.887 [576:299941] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores (schema mismatch or migration failure). It cannot perform a save operation.'
  • Validation error missing attribute values on mandatory destination attribute :

    kann das sein, dass du beim neuen Attribut noch nicht alles gesetzt hast, was gebraucht wird ? Mindestens ein Typ muss gesetzt sein.
    Es gibt zwei Dinge, die sind unendlich. Das Universum und die menschliche Dummheit. Wobei beim Universum bin ich mir nicht sicher - Albert Einstein
  • Lange her das ich mit CD gearbeitet habe aber ich bin mir sicher da gab es auch ein Flag, das das attribut nicht leer sein darf. Und wenn das gesetzt ist, dann muss man natuerlich einen defaulkt wert angeben, den das attribut bekommt wenn es migriert wird.
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • ich habs hinbekommen - bin mir aber noch nicht ganz sicher woran es lag.

    habe folgendes Beispiel:

    Core Data Version 1
    Entity: Database
    Arttribute: Vorname, Nachname

    und die zugehörige Class:

    Quellcode

    1. class Database: NSManagedObject {
    2. @NSManaged var Vorname: String
    3. @NSManaged var Nachname: String
    4. }

    dass ich mit Hilfe der Core Data Migration ein weiteres Attribute hinzufügen kann, scheint zu klappen.
    Kann ich allerdings auch den Entitynamen sowie die den ClassNamen umbennen?


    oder müsste in einem solchen Fall alles aus "Database" abrufen und in die neue Entity übertragen?
  • scheint aber doch zu gehen.
    habe es jetzt mal getestet und mit der rename id von core data gearbeitet.
    habe ein attribute hinzugefügt, entityname und classname geändert. alle daten noch da :)