Der Hintergrund
NSMigratePersistentStoresAutomaticallyOption
beim Hinzufügen der
Beständiger Speicher [NSNumber
numberWithBool:YES]
Das Problem
Egal was ich migrieren mache, bekomme ich die Fehlermeldung:
"Beständige Speichermigration fehlgeschlagen, fehlendes Modell des verwalteten Quellobjekts. "
Was ich versucht habe
Ich bin am Ende meiner Weisheit.
Ich kann nicht anders, als zu denken, dass ich irgendwo einen großen Fehler gemacht habe, den ich nicht sehe. Irgendwelche Ideen?
Zwei Möglichkeiten:
Aktivieren Sie Kerndaten-Debugging und Sie sollten in der Lage sein, die Hashes zu sehen, nach denen Core Data bei der Migration sucht. Vergleichen Sie diese Hashes mit denen in Ihrem Geschäft auf der Festplatte und sehen Sie, ob sie übereinstimmen. In ähnlicher Weise sollten Sie beim Debugging die Hashwerte im Mapping-Modell sehen, damit Sie alles abgleichen können.
Wenn nur Ihr Mappingmodell falsch ausgerichtet ist, können Sie es über das Designmenü in Xcode von der Quelle aus aktualisieren. Wenn Sie das tatsächliche Quellmodell für Ihre Geschäftsdatei auf dem Datenträger nicht finden, können Sie in Ihrem Versionskontrollsystem nachsehen oder eine automatische Migration verwenden, um diese Datei auf das Modell zu migrieren, das Ihrer Meinung nach die Quelle ist.
Der Speicherort für die Quell- und Zielmodelle wurde an den unteren Rand des Editorfensters verschoben:
Anstatt alle Modelle in der Bündel, ich habe die zwei Modelle angegeben Ich möchte (Modell 1 und das neue Version von Modell 2) und fusionierte sie Verwenden von ModelByMergingModels:
Das scheint nicht richtig zu sein. Warum die Modelle zusammenführen? Sie möchten Modell 2 verwenden und Ihren Speicher von Modell 1 migrieren.
Aus der NSManagedObjectModel-Klassenreferenz
modelByMergingModels:
Erzeugt eine einzelne Modell aus einer Reihe von bestehenden Modelle.
Sie müssen mit Ihrem Quellmodell ( Modell 1 ) nichts Spezielles / Spezifisches tun. Solange es sich in Ihrem Paket befindet, wird es im automatischen Lightweight-Migrationsprozess erkannt und verwendet .
Ich würde vorschlagen, das Mapping-Modell aufzugeben, das Sie in XCode erstellt haben, da ich sah schreckliche Leistung im Vergleich zu den automatischen leichten Migrationen. Ihre Laufleistung kann variieren, meine Änderungen zwischen den Modellen unterscheiden sich von denen Ihrer, aber ich wäre nicht überrascht. Versuchen Sie ein Timing mit und ohne eigenes Mapping-Modell im Bundle.
%Vor%Sie können in Ihrem Code überprüfen, ob Ihr Quellmodell verfügbar ist, indem Sie versuchen, es zu laden und zu überprüfen, ob es nicht nil ist:
%Vor%Dies setzt in Ihrem Projekt voraus, dass Sie eine Ressource " YourModelName.xcdatamodel " und " YourModelName.xcdatamodel " darin haben.
Außerdem können Sie überprüfen, ob dieses Modell mit Ihrem vorhandenen permanenten Vormigration-Speicher kompatibel ist:
%Vor% Dieser Code setzt voraus, dass Sie eine Methode -storeURL
haben, um anzugeben, von wo der persistente Speicher geladen wird.
Beim Versuch, das Core Data-Modell einer vorhandenen App zu aktualisieren (und alte Daten zu migrieren), habe ich einfach ein Szenario durchgelesen, in dem ein Framework von Drittanbietern Daten in die Datenbank einer App geschrieben hat. Ich habe den folgenden Fehler erhalten: "Modell für Quellspeicher kann nicht gefunden werden." Da das Drittanbietermodell beim Versuch der Migration nicht geladen wurde, ist die Migration fehlgeschlagen.
Ich habe diese Methode (unten) während der Fehlerbehebung dieses Problems geschrieben. Es kann nützlich sein für diejenigen, die mit diesen Arten von Problemen konfrontiert sind.
%Vor%Dieses Code-Snippet ruft die Metadaten eines Geschäfts ab.
%Vor%Die VersionInfo.plist (im Bündel der kompilierten Anwendung gespeichert) enthält die Hashwerte, die den verschiedenen Entitäten in Ihren Modellen zugeordnet sind (base64-Codierung). Entsprechend enthält eine BLOB-Spalte im Datenspeicher (Z_METADATA.Z_PLIST) eine binär codierte Eigenschaftsliste, die die Hashes (auch base64-codiert) für jede Entität enthält, die den Daten zugeordnet ist.
Die Methode -entitiesByName für NSManagedObjectModel eignet sich zum Dumping von Entitäten und Hashes, die in einem bestimmten Modell vorhanden sind.
Ich hatte ein ähnliches Problem. Ich habe +modelByMergeingModels:
verwendet, aber ich habe das Mapping-Modell nicht verwendet. Das Zusammenführen von Modellen funktioniert jedoch nicht mit einer einfachen Datenmigration.
Aus den Apple Text & Tabellen:
Um eine automatische leichtgewichtige Migration durchzuführen, müssen Core Data in der Lage sein, die Quelle und das Ziel des verwalteten Objekts Modell selbst zur Laufzeit zu finden.
Wenn Sie +modelByMergeingModels:
verwenden, das für das Zielmodell verwendet wird. Core Data kann das Quellmodell jedoch nicht finden. Das Quellenmodell wurde mit +modelByMergeingModels:
in einer älteren Version der Anwendung erstellt, und Core Data versucht, Modelle zusammenzuführen, um das Quellenmodell herauszufinden.
Was ich getan habe, ist, dass ich (manuell) eine neue zusammengeführte .xcdatamodeld
erstellt habe, indem ich die XML-Dateien der Modelle bearbeitet, sie in das Projekt eingefügt habe, die separate .xcdatamodeld
s von Compile Sources entfernt habe und statt Verwenden Sie +modelByMergeingModels:
verwenden Sie NSManagedObjectModel
's -initWithContentsOfURL:
mit der URL des neuen zusammengeführten Modells. Ich werde wahrscheinlich ein Skript erstellen, das die Modelle in Zukunft automatisch zusammenführt.
Tags und Links objective-c cocoa core-data migration mapping-model