Das zum Öffnen des Geschäfts verwendete Modell ist nicht mit dem zum Erstellen des Geschäfts verwendeten Modell kompatibel

181

Ich habe in xcode 3.2 ein Core Data-Modell erstellt und nach dem Upgrade in Xcode 4.2 eine neue Entität der NSManagedObject-Unterklasse hinzugefügt (siehe neue Entität).

Als erstes sieht es komisch aus, weil es nicht in der gleichen Gruppe wie die alte ist. Hier ist das Bild auf meinem xcode 4.2 (AlkitabDB ist das Bild, das ich in xcode 3.2 erstellt habe, EndeDB ist das neue Bild aus der aktuellen xcode-Version (4.2):

Die neue Entität ist nicht in xdatamodel gruppiert

Zweitens lasse ich es so wie es ist, dann habe ich auf die zweite Entität (die neue) auf die gleiche Weise zugegriffen wie auf die erste Entität (die alte), und der Fehler mit dem Titel wird angezeigt.

Hier ist der Fehler:

2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata=<CFBasicHash 0x882a370 [0x1839b38]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x8829b90 [0x1839b38]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x8829ff0 [0x1839b38]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x8829bc0 [0x1839b38]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x8829770 [0x1839b38]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x8829bf0 [0x1839b38]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x882a080 [0x1839b38]>{type = immutable dict, count = 1,
entries =>
    0 : <CFString 0x882a010 [0x1839b38]>{contents = "AlkitabDB"} = <CFData 0x882a030 [0x1839b38]>{length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd}
}

    7 : <CFString 0x10e3aa8 [0x1839b38]>{contents = "NSStoreUUID"} = <CFString 0x8829e60 [0x1839b38]>{contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"}
    8 : <CFString 0x10e3948 [0x1839b38]>{contents = "NSStoreType"} = <CFString 0x10e3958 [0x1839b38]>{contents = "SQLite"}
    9 : <CFString 0x8829c40 [0x1839b38]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6b1c7c0 [0x1839b38]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x8829c70 [0x1839b38]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x882a0c0 [0x1839b38]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            AlkitabDB = <d02ac5f8 be6ab0b3 9add450a ca202ac0 ebd1e860 cbb578c2 3d45d462 998d2ccd>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}

Ich habe vorher nach der Lösung gesucht und festgestellt, dass ich die Anwendung aus dem Simulator entfernen und die App erneut ausführen sollte, und es hat nicht funktioniert. Kennt jemand eine Lösung für dieses Problem? Bitte helfen Sie.

dejoong
quelle

Antworten:

294

Das Löschen der App ist manchmal nicht der Fall! Schlagen Sie vor, Ihre App wurde bereits veröffentlicht! Sie können der Datenbank nicht einfach eine neue Entität hinzufügen und fortfahren - Sie müssen eine Migration durchführen!

Für diejenigen, die sich nicht mit Dokumentation befassen möchten und nach einer schnellen Lösung suchen:

  1. Öffnen Sie Ihre .xcdatamodeld-Datei
  2. Klicken Sie auf Editor
  3. Wählen Sie Modellversion hinzufügen ...
  4. Fügen Sie eine neue Version Ihres Modells hinzu (die neue Gruppe von Datenmodellen wurde hinzugefügt)
  5. Wählen Sie die Hauptdatei aus, öffnen Sie den Dateiinspektor (rechtes Feld)
  6. und Versioned core data modelwählen Sie unter Wählen Sie Ihre neue Version des Datenmodells für das aktuelle Datenmodell aus
  7. DAS IST NICHT ALLES) Sie sollten eine sogenannte "Lichtmigration" durchführen.
  8. Gehen Sie zu Ihrem AppDelegateund finden Sie heraus, wo das persistentStoreCoordinatorerstellt wird
  9. Finde diese Zeile if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. Ersetzen Sie nilOptionen durch @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}(tatsächlich im kommentierten Code dieser Methode angegeben)
  11. Los geht's, viel Spaß!

PS Dies gilt nur für die Lightweight-Migration. Damit Ihre Migration als einfache Migration qualifiziert werden kann, müssen sich Ihre Änderungen auf dieses schmale Band beschränken:

  • Hinzufügen oder Entfernen einer Eigenschaft (Attribut oder Beziehung).
  • Machen Sie eine nicht optionale Eigenschaft optional.
  • Machen Sie ein optionales Attribut nicht optional, solange Sie einen Standardwert angeben.
  • Hinzufügen oder Entfernen einer Entität.
  • Benennen Sie eine Eigenschaft um.
  • Benennen Sie eine Entität um.

Für Swift 4

coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
Stas
quelle
2
Hauptdatei ist das von Ihnen erstellte .xcdatamodel. Sie sollten die erste Registerkarte des Utilities-Bereichs (rechte Seite eins) öffnen, "Modellversion" (Xcode 5.1) suchen und Aktuell auswählen: "Ihr neu erstelltes .xcdatamodel"
Stas
1
@ Computer_whiz123, in XCode 5.1.1 heißt es 'Model Version'
Stas
1
Wie würde ich das machen, ist Swift?
Addison
2
Ich erhalte die folgende Fehlermeldung: "CoreData: Fehler: -addPersistentStoreWithType: SQLite-Konfiguration: (null) URL: Datei: ///...file.sqlite Optionen: {NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStoresAutomaticallyOption = 1;} ... Fehler zurückgegeben Domain = NSCocoaErrorDomain Code = 134130 "Der Vorgang konnte nicht abgeschlossen werden. (Kakaofehler 134130.) "
CarmenA
3
Schnelle Migrationsoptionen:let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
Hamza
285

Entfernen Sie die App aus dem Simulator und führen Sie eine Bereinigung Ihres Projekts durch. Das sollte diese Probleme klären. Stellen Sie sicher, dass Sie nicht im Debugger ausgeführt werden, wenn Sie die App löschen, da sie sonst nicht ordnungsgemäß gelöscht wird.

Wenn Sie sicher sein möchten, dass es nicht mehr vorhanden ist, überprüfen Sie dieses Verzeichnis Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/unter der von Ihnen ausgeführten Version auf den Ordner Ihrer App.

Hinweis: Dies ist nur für die Entwicklung. Für die Produktion müssen Sie eine Art Migration implementieren. Google "Core Data Migration", wobei die einfache Migration die einfachste ist.

Philippe Sabourin
quelle
Danke für die Antwort von Philippe, ich habe es versucht und es hat nicht funktioniert :(, hast du einen anderen Vorschlag?
dejoong
Können Sie den Code, den Sie zum Erstellen des Modells und des persistenten Speichers verwenden, in Ihrem App-Delegaten veröffentlichen?
Philippe Sabourin
Es ist ein bisschen unvernünftig, warum dies passiert und warum eine solche Lösung den Trick macht, aber das ist das. Ich kann nicht helfen. Nywaz, hier ist meine Stimme. Das Beste, was ich jetzt tun kann, um Ihre Richtlinien zu würdigen. Vielen Dank für die Hilfe Kumpel. !!
Apple_iOS0304
Hat mir geholfen, ein Problem in Xcode 4.6 zu lösen, bei dem ich versehentlich alle meine
Projektdateien
6
Dies ist nur für die Entwicklung! Für die Produktion verwenden Sie die Modellversionierung und -migration. developer.apple.com/library/ios/#documentation/cocoa/Conceptual/…
Philippe Sabourin
35

Fügen Sie einfach das Attribut Options hinzu , während Sie persistentStoreCoordinator in der Datei AppDelegate.m für die Kerndatenmethode wie folgt erstellen

ZIEL C

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil)
    {
        return _persistentStoreCoordinator;
    }

    NSLog(@"persistentStoreCoordinator___");
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"];

    NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    NSLog(@"persistentStoreCoordinator___2");
    return _persistentStoreCoordinator;
}

SCHNELL

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
    var failureReason = "There was an error creating or loading the application's saved data."

    // MAIN LINE OF CODE TO ADD
    let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
                    NSInferMappingModelAutomaticallyOption: true]

    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions)
    } catch {
        // 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 as NSError
        let wrappedError = 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 \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}

Es hatte mein Problem gelöst ..

Dhaval H. Nena
quelle
1
Vielen Dank für diesen Beitrag, es ist wirklich hilfreich
Subramani
23

Antwort: Entfernen Sie die App aus dem Simulator, führen Sie eine Bereinigung durch und erstellen Sie Ihr Projekt neu.

Hinweis: Wenn Sie Änderungen an der Kerndatendefinition vornehmen, löschen Sie die auf dem physischen Gerät oder Simulator installierte App, bereinigen Sie das Projekt und erstellen Sie es erneut.

Bhavin
quelle
Das Zurücksetzen von Inhalten und Einstellungen im Simulator hat das Problem für mich behoben! Danke.
10.
14

Ja. Sobald Sie die App auf einem physischen Gerät löschen und neu erstellen, funktioniert sie.

world-software.net
quelle
Dies löste tatsächlich mein Problem und nicht die akzeptierte Antwort. Vielen Dank!
Ken W
Was in der Produktion passiert, ist nicht die Antwort
Eduardo Oliveros
Dies ist eine schreckliche Antwort, Sie müssen Migration zu Ihrem neuen Modell hinzufügen, sonst stürzt die App in prod
aryaxt
14

Suchen Sie für schnell in AppDelegate.swift die Zeile

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration:  nil, URL: url, options: nil )

und ersetzen Sie es durch

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
Ali Asgher Lakkadshaw
quelle
11

Ich habe gerade einige Tage damit verbracht, diesen Fehler zu bekämpfen, zusammen mit MergelModelFromBundles zu stürzen und den Fehler "Modelle können nicht mit zwei verschiedenen Entitäten namens * zusammengeführt werden" zu erhalten.

Es stellte sich heraus, dass das Hauptproblem darin bestand, dass Xcode keine alten Ressourcen von Geräten entfernt und ich alte Versionen meines Datenmodells (.mom-Dateien) hatte, die Konflikte verursachten. Aus diesem Grund wurde das Problem durch Löschen der App auf einem meiner Geräte behoben.

Nachdem ich diesen Blog-Beitrag über eine andere SO-Antwort gefunden hatte, machte ich meine App toleranter gegenüber alten Modellen, indem ich diese Zeile änderte, die nach ALLEN .mom-Dateien sucht:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

dazu, was nur im Filterverzeichnis aussieht:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Filters" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

Ich habe recursivePathsForResourcesOfType aus dieser Frage verwendet : Um dies herauszufinden, protokollieren Sie alle .mom-Dateien in der App:

NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]];
NSLog(@"All .mom files:%@",momPaths);

Ich habe auch iExplorer verwendet , um die fremden .mom-Dateien anzuzeigen (ich habe noch nicht versucht, sie zu löschen).

Die folgende Methode war ebenfalls hilfreich. Es zeigte sich, dass sich eine Entität in dem zusammengeführten Modell befand, das von [psc manageObjectModel] zurückgegeben wurde und in keinem meiner Modelle oder im Geschäft selbst mehr vorhanden war. Dies ließ mich glauben, dass ein altes Modell auf dem Gerät selbst zwischengespeichert wurde, das durch ein sauberes Gebäude nicht entfernt wurde. Die Methode protokolliert jede Entität, die identisch ist, geändert, hinzugefügt oder aus dem Modell entfernt wurde. (geschrieben mit dieser SO-Antwort als Ausgangspunkt):

- (BOOL)comparePersistentStore:(NSPersistentStoreCoordinator *)psc withStoreURL: (NSURL *)storeURL {
    NSError *error = nil;

    // Get the entities & keys from the persistent store coordinator
    NSManagedObjectModel *pscModel = [psc managedObjectModel];
    NSDictionary *pscEntities = [pscModel entitiesByName];
    NSSet *pscKeys = [NSSet setWithArray:[pscEntities allKeys]];
    //NSLog(@"psc model:%@", pscModel);
    //NSLog(@"psc keys:%@", pscKeys);
    NSLog(@"psc contains %d entities", [pscModel.entities count]);

    // Get the entity hashes from the storeURL
    NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                                                          URL:storeURL
                                                                                        error:&error];
    NSDictionary *storeHashes = [storeMetadata objectForKey:@"NSStoreModelVersionHashes"];
    //NSLog(@"store metadata:%@", sourceMetadata);
    NSLog(@"store URL:%@", storeURL);
    NSLog(@"store NSStoreUUID:%@", [storeMetadata objectForKey:@"NSStoreUUID"]);
    NSLog(@"store NSStoreType:%@", [storeMetadata objectForKey:@"NSStoreType"]);
    NSSet *storeKeys = [NSSet setWithArray:[storeHashes allKeys]];

    // Determine store entities that were added, removed, and in common (to/with psc)
    NSMutableSet *addedEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *removedEntities = [NSMutableSet setWithSet:storeKeys];
    NSMutableSet *commonEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *changedEntities = [NSMutableSet new];
    [addedEntities minusSet:storeKeys];
    [removedEntities minusSet:pscKeys];
    [commonEntities minusSet:removedEntities];
    [commonEntities minusSet:addedEntities];

    // Determine entities that have changed (with different hashes)
    [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
        NSData *storeHash = [storeHashes objectForKey:key];
        NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
        if ( ! [pscDescrip.versionHash isEqualToData:storeHash]) {
            if (storeHash != nil && pscDescrip.versionHash != nil) {
                [changedEntities addObject:key];
            }
        }
    }];

    // Remove changed entities from common list
    [commonEntities minusSet:changedEntities];

    if ([commonEntities count] > 0) {
        NSLog(@"Common entities:");
        [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([changedEntities count] > 0) {
        NSLog(@"Changed entities:");
        [changedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\tpsc   %@:\t%@", key, pscDescrip.versionHash);
            NSLog(@"\tstore %@:\t%@", key, storeHash);
    }];
    }
    if ([addedEntities count] > 0) {
        NSLog(@"Added entities to psc model (not in store):");
        [addedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([removedEntities count] > 0) {
        NSLog(@"Removed entities from psc model (exist in store):");
        [removedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSLog(@"\t%@:\t%@", key, storeHash);
        }];
    }

    BOOL pscCompatibile = [pscModel isConfiguration:nil     compatibleWithStoreMetadata:storeMetadata];
    NSLog(@"Migration needed? %@", pscCompatibile?@"no":@"yes");

    return pscCompatibile;
}

Verwendung: Wird aufgerufen, bevor jeder Speicher zu NSPersistentStoreCoordinator hinzugefügt wird:

    [self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL];
    _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType
                                          configuration:nil
                                                    URL:self.iCloudStoreURL
                                                options:options
                                                  error:&localError];
Symmetrisch
quelle
10

Jedes Mal, wenn Sie Änderungen an der Core Date-Definition vornehmen, sollten Sie die auf dem physischen Gerät oder Simulator installierten Apps löschen.

pierrotlefou
quelle
20
Was ist mit Produktions-Apps? Werden sie sofort abstürzen, wenn Sie ein Update mit Änderungen an den Kerndaten an den App Store senden? Thx
rwyland
3
Ja, Änderungen am CD-Modell verhindern, dass mit dem vorherigen Modell generierte Daten geladen werden. Um dies zu handhaben, müssen Sie das Problem erkennen und eine Kerndatenmigration durchführen.
Johan
8
  1. Stoppen Sie die Ausführung der App.
  2. App im Simulator löschen.
  3. Product -> Clean
  4. Bauen, laufen.
Tom Howard
quelle
4
schlechte Praxis in der Produktion, Absturz der App
Eduardo Oliveros
7

Die einfachste Lösung, die in Swift 2.1, Xcode 7 für mich funktioniert hat, ist:

  1. Löschen Sie die App aus dem Simulator (Befehlstaste + Umschalt + H, um zum Startbildschirm zu gelangen. Drücken Sie lange auf die App. Klicken Sie auf Kreuz, wie gewohnt, um eine App von Ihrem Telefon zu löschen.)

  2. Cmd + Shift + H erneut, um das Tanzen von Apps zu stoppen

  3. Gehen Sie zurück zu Ihrem Projekt und führen Sie es erneut aus

Ich hatte dieses Problem beim Schreiben / Lesen von Core Data mit 2 eingerichteten Entitäten. Das Löschen der App und das erneute Ausführen des Programms haben das Problem behoben

Naishta
quelle
2
schlechte Praxis in der Produktion, Absturz der App
Eduardo Oliveros
6

Ich habe gerade die [Simulator App Folder]/Document/*.sqliteDatei gelöscht , nachdem ich Änderungen an Entitäten vorgenommen hatte, und es hat funktioniert. Und natürlich enthält die .sqlite-Datei alle gespeicherten Daten und Strukturen, die verloren gehen.

AHHP
quelle
2
Hat auch für mich gearbeitet. Es scheint vernünftig, dass dies ausreichen sollte. Sie verlieren alle die Daten bereits in der DB aber ...
bor
6

Bitte löschen Sie eine Anwendung aus dem Simulator und bereinigen Sie einen Code und führen Sie .its funktioniert einwandfrei.

Sarit Bahuguna
quelle
6

Wenn Sie Swift verwenden.

Folgen Sie der Antwort von @Stas und fügen Sie anstelle von Null Optionen in Ihren App-Delegaten ein:

let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
            NSInferMappingModelAutomaticallyOption: true]
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {
JZ.
quelle
1
Ich bin mir nicht sicher, warum das abgelehnt wurde, aber ich habe es korrigiert. Vielen Dank für die Bereitstellung der Syntax für Swift.
Matt Long
Nett! Es funktioniert! Danke! Ich versuche 3 Stunden lang, dieses Problem zu lösen.
mr_ivan777
Wo soll dieser Code abgelegt werden? Ich lade Kerndaten mit diesem Code let container = NSPersistentContainer (Name: "modeldb") container.loadPersistentStores (CompletionHandler: {(storeDescription, error) in wenn let error = error als NSError? {
MAS. John
5

Versuchen Sie "Inhalt & Einstellungen zurücksetzen" im Simulator. Arbeitete für mich nach dem Löschen der App und Clean Build

Josh10
quelle
3
Wenn Sie dies tun, tritt dann nicht immer noch das gleiche Problem für Benutzer auf realen Computern auf?
Maury Markowitz
4

Ich hatte das gleiche Problem mit meiner App (noch nicht im App Store veröffentlicht).

So habe ich es behoben:

  1. Führen Sie Clean aus (Cmd + Shift + K).
  2. Starten Sie iOS Simulator neu
  3. iOS Simulator -> Inhalt und Einstellungen zurücksetzen (über die Navigationsleiste)

(3) war der Schritt, der es endlich richtig laufen ließ. Hoffe das hilft!

bigtex777
quelle
2

Obwohl Sie die App manchmal einfach vom Gerät entfernen können, wenn Sie das Schema im verwalteten Objektmodell ändern, ist dies in einigen Szenarien nicht möglich, z. B. weil Sie Ihre App bereits mit einem alten Schema veröffentlicht haben.

In diesem Fall müssen Sie darauf achten, alte Daten in das neue Schema zu migrieren:

Kerndatenmodellversionierung und Datenmigration

Mike
quelle
2

Wenn Sie Änderungen an Ihrem Core Data-Modell vornehmen, müssen Sie eine Migrationsrichtlinie bereitstellen, die Core Data mitteilt, wie vorhandene persistente Objekte (die Ihre Benutzer mit der aktuell veröffentlichten Version erstellt haben) in das neue Modell übernommen werden.

In einigen Szenarien kann Core Data die Zuordnung vom alten zum neuen Modell automatisch ableiten. Für komplexere Änderungen müssen Sie möglicherweise eine Logik implementieren, die die Migration durchführt.

Details finden Sie im Programmierhandbuch für die Versionierung und Datenmigration von Kerndatenmodellen .

Update
Diese Antwort hier auf Stack Overflow behandelt die Grundlagen der einfachen Migration von Core Data und enthält auch Code, mit dem Sie beginnen können.

Thomas Zoechling
quelle
Hier ist meine Antwort für die Datenmigration: stackoverflow.com/questions/8881453/…
Dhaval H. Nena
1

Dieses Problem tritt im Allgemeinen aufgrund einer Inkompatibilität zwischen der Version auf, auf der die Datenbank erstellt wurde. Der allgemeine Ansatz für dieses Problem besteht darin, die App zu löschen und neu zu installieren . In Ihrem erwähnten Fall ist die Version von DB in Xcode 3.2 und 4.2 jedoch völlig anders. Verwenden Sie also besser dieselbe Version von Xcode für DB.

Jayprakash Dubey
quelle
1

Erstens sollten nur Dateien im xcdatamodeldBundle enthalten sein xcdatamodel. Ihre Unterklassen sollten NICHT in der seinxcdatamodeld . Bewegen Sie die da raus. Es besteht die Möglichkeit, dass sie den Compiler verwirren.

Zweitens zeigt der Fehler an, dass Core Data Ihr Modell nicht finden kann. Haben Sie Daten erstellt und dann das Modell berührt? Wenn ja, befinden Sie sich in einem inkonsistenten Zustand und müssen dies beheben, indem Sie entweder die Daten löschen (was Philippe vorgeschlagen hat) oder indem Sie Ihre Änderungen am Modell zurücksetzen .

Marcus S. Zarra
quelle
Haben Sie eine Idee, wie ich das Modell aus dem xcdatamodel-Bundle herausnehmen kann? oder sollte ich es einfach löschen?
Dejoong
Das Modell, bei dem es sich um die xcdatamodelDatei handelt, sollte sich dort befinden. Es sind die .h- und .m-Dateien, die verschoben werden müssen. Verwenden Sie den Finder.
Marcus S. Zarra
0

Ich habe den Fehler erhalten, aber der Grund, warum ich den Fehler erhalten habe, war der folgende.

Ich hatte ursprünglich eine Entität mit dem Namen "Eintrag" und eine Zeile für diese Entität in der Datenbank gespeichert. Ich habe dann eine weitere Entität mit dem Namen "Person" hinzugefügt und nach dem Hinzufügen wurde diese erstellt und der Fehler angezeigt. Also löste ich das Problem, indem ich die Entität "Person" löschte und dann die App erstellte, die Zeile in "Eintrag" löschte und dann die Anwendung schloss. Ich habe dann die App komplett von meinem Handy gelöscht und dann neu erstellt und es hat gut funktioniert. Sie sind sich nicht sicher, welcher Schritt das Problem behoben hat (das Löschen der Zeile oder der App), aber wenn Sie nach einer Lösung suchen, hilft dies hoffentlich. :) :)

Bearbeiten: Oh, und wenn Sie sich Sorgen gemacht haben, Ihre neue Entität (in meinem Fall "Person") zu löschen, um die App erneut zu erstellen, denken Sie daran, dass Sie sie anschließend mit CMD + Z zurückerhalten können!

daveomcd
quelle
0

Ich hatte dieses Problem - ich habe zuerst meinen Simulator zurückgesetzt und dann das Projekt bereinigt und neu erstellt. Und dann funktioniert es.

Yashu
quelle
0

Wenn Sie Kerndaten ändern (Hinzufügen eines Felds zur Tabelle, Entfernen von Feldern usw.), muss die SQLite-Datei im Anwendungsdokumentordner mit Ihrem Schema synchronisiert sein.

Diese Datei wird standardmäßig nicht überschrieben, diese Datei muss neu generiert werden.

Folge diesen Schritten:

  1. Wechseln Sie zu dem Ordner, auf den NSURL zeigt. (Dieser Pfad befindet sich in einer Ausnahmemeldung, die von der Anwendung vor dem Absturz generiert wurde.) Beispiel: / Benutzer // Bibliothek / Anwendungsunterstützung / iPhone Simulator // Anwendungen // Dokumente

  2. Entfernen oder benennen Sie die SQLite-Datei um

  3. Reinigen Sie die Anwendung und führen Sie sie erneut aus
  4. Durch erneutes Ausführen der Anwendung wird eine neue SQLite-Datei generiert.

Dadurch wird sichergestellt, dass das Schema und der Xcode synchron sind.

Prashant Nidgunde
quelle
-1

Für die Entwicklung von Mac-Apps:

  1. Reinigen Sie das Projekt
  2. Abgeleitete Daten bereinigen
  3. Gehen Sie zu / Users / YOUR_NAME / Library / Containers / YOUR_APP_BUNDLE_ID / Data / Documents / und löschen Sie alle darin enthaltenen Dateien (z. B. ".sqlite", ".sqlite-shm" ...).

Es hat bei mir funktioniert, hoffe das könnte hilfreich sein.

Eneko
quelle
-2

iOS Simulator -> Inhalt und Einstellungen zurücksetzen ...

Hat für mich gearbeitet

iOS Simulator -> Inhalt und Einstellungen zurücksetzen ... -> Zurücksetzen Funktioniert auch unter iOS9 (xcode 7.1)

niravdesai21
quelle
4
schlechte Praxis in der Produktion, Absturz der App
Eduardo Oliveros