Frage

Ich versuche eine App zu aktualisieren, die einen Kerndatenspeicher implementiert. Ich füge einem der Entitäten ein Attribut hinzu.

Ich habe meinen Delegiertenkurs den folgenden Code hinzugefügt:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Shoppee.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        NSLog(@"Error: %@",error);
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator;
}

Dies war aus der folgenden URL:Dokument

Ich erhalte den folgenden Fehler bei der Ausführung des Codes:

2009-12-01 20:04:22.877

Shoppee [25633: 207] Fehler: Fehler

Domain = NSCOCOAERRORDOMAIN CODE = 134130

UserInfo = 0x1624d20 "Vor Operation konnte nicht abgeschlossen sein. (Kakaofehler 134130.)" 2009-12-01 20: 04: 22.879 Shoppee [25633: 207] Ungeröstete Fehlerdomain Domain = NSCOCOARRordomain Code abgeschlossen. (Cocoa-Fehler 134130.) ", {url = file: // localhost/user/eric/bibliothek/application%20Support/iPhone%20Simulator/user/applications/a8a8fb73-9ab9-4eb7-8f83-82f5b4467af1/documents/myApp/myApp .sqlite; metadata = {nSpersistenceFrameWorkVersion = 241; NSstoremodelversionHashes = {item = <869D4B20 088E5C44 5C345006 87D245CD 67AB9BC4 14CADF45 180251E9 F741A98F>; Store = <47C250F4 895E6FD1 5033AB42 22D2D493 7819BA75 3C0ACFFC 2DC54515 8DEEED7A>; }; NSstoremodelversionHashesversion = 3; NSstoremodelversionIdentifiers = (); NSstoretype = sqlite; NSstoreUUID = "8DC65301-3BC5-42BE-80B8-E44577B8F8E1"; }; Reason = "Kann kein Modell für den Quellgeschäft finden"; }

Es sieht so aus, als müsste ich das Originaldatenmodell irgendwie einbeziehen, aber ich bin mir nicht sicher, wie ich das machen soll. Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Um zu rekapitalisieren/vollständige Anleitung:

  1. Erstellen Sie vor einer Änderung eine neue Modellversion.

    In Xcode 4: Wählen Sie Ihre aus .xcdatamodel -> Editor -> Modellversion hinzufügen.

    In Xcode 3: Design -> Datenmodell -> Modellversion hinzufügen.

    Sie werden das sehen, das neue .xcdatamodel wird in Ihrem erstellt .xcdatamodeld Ordner (der auch erstellt wird, wenn Sie keine haben).

  2. Speichern.

  3. Wählen Sie Ihr neues aus .xcdatamodel und machen Sie die Änderung, die Sie in Übereinstimmung mit einem Antrag stellen möchten das Leichte Migration Dokumentation.

  4. Speichern.

  5. Stellen Sie das aktuelle/aktive Schema auf das neu erstellte Schema ein.

    Mit dem .xcdatamodeld Ordner ausgewählt:

    In Xcode 4: Dienstprogramm -Seitenleiste -> Dateiinspektor -> Versioned Core -Datenmodell -> Wählen Sie das neue Schema aus.

    In Xcode 3: Design> Datenmodell> Aktuelle Version festlegen.

    Das grüne Zecken auf der .xcdatamodel Icon wechselt zum neuen Schema.

  6. Speichern.

  7. Implementieren Sie den erforderlichen Code zur Durchführung von Migration zur Laufzeit.

    Wo du NSPersistentStoreCoordinator wird erstellt (normalerweise AppDelegate -Klasse), für die options Parameter, ersetzen nil mit dem folgenden Code:

    [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                      [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
    
  8. Führen Sie Ihre App aus. Wenn es keinen Absturz gibt, haben Sie wahrscheinlich erfolgreich ausgewandert :)

  9. Wenn Sie erfolgreich migriert sind, kann der Migrationscode (Schritt 7) entfernt werden. (Es liegt an dem Entwickler zu bestimmen, wann die Benutzer einer veröffentlichten App als migriert angesehen werden können.)

WICHTIG: Löschen Sie keine alten Modellversionen/Schemas. Kerndaten benötigen die alte Version, um in die neue Version zu migrieren.

Andere Tipps

Ich habe es herausgefunden.

Design> Datenmodell> Modellversion hinzufügen

Für Googlers müssen Sie dies erneut tun (vorausgesetzt, Sie haben bereits eine leichte Migration eingerichtet):

  1. Bevor Sie Änderungen vornehmen, entwerfen Sie -> Datenmodell -> Modellversion hinzufügen (Sie werden das sehen, das neue .xcdatamodel wird in Ihrem erstellt .xcdatamodeld Mappe)
  2. Speichern
  3. Nehmen Sie Ihre Änderung vor
  4. Speichern
  5. App ausführen

Schritt 1 ist entscheidend, um diese Arbeit zu machen. Ich bin auf dieses Problem gestoßen, weil ich diese Schritte befolgt hatte, um ein neues Feld hinzuzufügen. Das hat funktioniert. Ich habe ein zweites neues Feld hinzugefügt, aber vergessen, "Modellversion hinzuzufügen", und die Dinge sind in die Luft gesprengt.

Auch für Googlers .. Einfache Regel, löschen/bearbeiten Sie niemals eine alte nummerierte Version. Wenn Sie eine Modellversion hinzufügen, erhöht sich das Zahlensuffix mit 2..3..4 bedeutet 2 die älteste 3 als nächstes usw., aber die aktuelle zu bearbeiten ist die nicht nummerierte Version.

Löschen Sie alte Modellversionen nicht, da Benutzer mit vorheriger DB mit einer alten Modellversion nicht in der Lage sind, auf Ihr neuestes DB -Modell zu migrieren, ohne alte und neueste Schemas zu vergleichen.

Nur eine Notiz für diejenigen, die auf dieses Googeln stoßen. Es scheint sogar mit automatischer (magischer) Migration, dass Sie noch eine Version Ihres ursprünglichen Store erstellen müssen, und eine neue, und die neue als aktuelle Version festlegen.

Bisher sehe ich nur, wie ich die Fehlermeldung vermeiden kann.

Aber wie reparieren wir es - falls wir die Dinge schon vermasselt haben?

Die folgende Lösung Das Problem behoben, aber Sie werden die Daten verlieren in der DB:

Löschen / Umbenennen Sie die SQLite -Datei der bereitgestellten / installierten Anwendung.
Die Dateien nennen einen Speicherort werden direkt nach der Fehlermeldung angegeben. z.B:

Grund = kein Modell für Quellstore finden}, {
URL = "file: //localhost/users/yourname/library/application%20support/iphone%20Simulator/4.3/applications/62f342d4-f007-4f6f-96d2-68f902d3719a/documents/locations.sqlite";

Etwas zu beachten, wenn man eine leichte Migration durchführt -

Wenn Sie die Attribute umbenennen/ändern möchten, denken Sie daran, den Wert "Umbenennung von ID" entweder im neuen oder im alten Modell festzulegen. Um das eigene Beispiel von Apple in Xcode 4.3 zu verwenden, wählen Sie PaintColor im neuen Modell> zum Datenmodellinspektor> Setzen Sie das Feld "Umbenennung von ID" in den Abschnitt "Versioning". Für mich führte das Versäumnis, diesen Schritt zu machen, zu einem Laufzeitfehler. Der gleiche Fehler ist auch hier bedeckt. Als neuer Benutzer darf ich keine Bilder veröffentlichen, also hier ist ein Imgur Link (wirklich nicht Spam).

    (Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration

Sie können diesen Fehler auch erhalten, wenn Sie das Datenmodell ändern und auf einer installierten App mit einer anderen Version der SQLite -Datei ausgeführt werden. In diesem Fall löschen Sie einfach die installierte App und führen Sie sie erneut aus.

Nur für den Fall, dass jemand in dieses Szenario trifft und keines der oben genannten funktioniert ... habe ich meine App aus dem Simulator, Reinigung usw. gelöscht, aber nichts würde funktionieren. Ich musste zum Simulator -Verzeichnis gehen und die .sqlite -Datei manuell rm, um die App erneut zum Laufen zu bringen. Keine Ahnung...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top