Kerndatenmigrationsproblem: "Persistente Speichermigration fehlgeschlagen, fehlendes verwaltetes Quellobjektmodell."

8

Der Hintergrund

  • Ein Cocoa Non Document Kerndaten Projekt mit zwei verwalteten Objekten Modelle.
  • Modell 1 bleibt gleich. Modell 2 hat sich geändert, also möchte ich migrieren der Laden.
  • Ich habe eine neue Version erstellt von Design & gt; Datenmodell & gt; Modell hinzufügen Version in Xcode.
  • Der Unterschied zwischen den Versionen ist eine einzelne Beziehung, die von eins zu eins geändert wurde.
  • Ich habe meine gemacht Änderungen am Modell, dann gespeichert.
  • Ich habe ein neues Mapping-Modell erstellt hat das alte Modell als Quelle und neu Modell als Ziel.
  • Ich habe es sichergestellt Alle Zuordnungsmodelle und Datenmodelle und werden kompiliert und alle sind kopiert in den Ressourcenordner von meinem App-Paket.
  • Ich habe Migrationen eingeschaltet in einem Wörterbuch mit der %Code% Schlüssel als NSMigratePersistentStoresAutomaticallyOption beim Hinzufügen der Beständiger Speicher
  • Anstatt zu verschmelzen Alle Modelle im Bundle, ich habe die beiden angegeben Modelle, die ich verwenden möchte (Modell 1 und die neue Version von Modell 2) und fusioniert sie verwenden [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 reinige nach jedem einzelnen Build.
  • Ich habe verschiedene Kombinationen ausprobiert Ich habe nur das Modell, das ich migriere in Ressourcen, kompiliert werden oder beide.
  • Seit der Fehlermeldung impliziert, dass es die Quelle nicht finden kann Modell für meine Migration, ich habe es versucht jede Version des Modells haben Sowohl der Ordner Resources als auch das Sein kompiliert.
  • Ich habe dafür gesorgt, dass ich es nicht bin einen wirklich grundlegenden Fehler machen durch Zurückschalten auf das Original Version meines Datenmodells. Die App läuft gut.
  • Ich habe das Mapping gelöscht Modell und die neue Version des Modell, gereinigt, dann beide neu erstellt.
  • Ich habe versucht, eine andere Änderung vorzunehmen im neuen Modell - Löschen einer Entität stattdessen.

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?

    
John Gallagher 22.03.2010, 12:19
quelle

4 Antworten

9

Zwei Möglichkeiten:

  1. Ihr Quellmodell in Ihrer App stimmt nicht mit dem tatsächlichen Geschäft auf der Festplatte überein.
  2. Ihr Zuordnungsmodell stimmt nicht mit Ihrem Quellmodell überein.

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.

Aktualisieren 1

Der Speicherort für die Quell- und Zielmodelle wurde an den unteren Rand des Editorfensters verschoben:

    
Marcus S. Zarra 22.03.2010, 12:37
quelle
6
  

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.

    
ohhorob 01.04.2010 05:01
quelle
3

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.

    
xyzzycoder 02.06.2011 20:56
quelle
0

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.

    
Marián Černý 20.11.2014 17:52
quelle