Kerndaten - Fehler beim Laden des optimierten Modells im Pfad

76

Ich erhalte einige dieser Ausdrucke in meiner Konsole, während ich meine Anwendung von Xcode 6 auf meinem iPhone 6 mit iOS 9 Beta 5 ausführe:

CoreData: Fehler beim Laden des optimierten Modells unter Pfad '/var/mobile/Containers/Bundle/Application/0000000B-BDBC-0000-000B-0000FB00000B/Distribution.app/database.momd/database.omo'

Ich kann nichts in diesem Zusammenhang finden. Hat jemand eine Ahnung von dieser Nachricht?

Glauco Neves
quelle
2
Ich sehe eine ähnliche Meldung mit Xcode 6, jedoch nur bei der Bereitstellung auf einem iOS 9-Gerät oder einer Sim. Ich sehe es nicht, wenn ich iOS auf einem Gerät oder einer Sim verwende, wenn ich die Xcode 7 Beta verwende. Angesichts der Tatsache, dass sich iOS 9 noch in der Beta befindet, ist dies vermutlich ein Fehler, der für die Xcode 6 iOS 9-Kombination spezifisch ist. Ich werde es vorerst ignorieren. Meine App funktioniert wie erwartet, daher werde ich mich nicht damit befassen, bis ich die Release Candidate-Versionen von iOS 9 / Xcode 7 sehe.
Tony Adams
6
Ich bekomme das auch mit Xcode 7 GM. Gibt es einen Hinweis darauf, worum es in dieser Fehlermeldung geht?
Buju
2
Gleiches gilt für Xcode 7 und iOS 9
Tatarasanu Victor,
1
Das gleiche Problem tritt bei GoogleMaps auf
Nullify
2
Dieser Fehler tritt bei einem neuen Projekt auf, wenn Sie beginnen, xcode 9 zu verwenden (ursprüngliches Schema, das mit xcode 8 erstellt wurde).
18.

Antworten:

13

Ich bin auf dieses Problem gestoßen und habe ein bisschen herumgegraben.

Ich habe mit Xcode 6.4 erstellt und es sieht so aus, als hätten Kerndaten zuvor nur eine .mom-Datei im Verzeichnis myApp.ipa momd erstellt. Dieser Screenshot stammt aus einem Projekt, das mehrere Versionen von Xcode gesehen hat.

Beachten Sie, dass alle älteren Modellversionen nur eine .mom-Datei haben. Ich habe heute gerade eine neue Modellversion erstellt, die sowohl eine .mom- als auch eine .omo-Datei enthält.

Geben Sie hier die Bildbeschreibung ein

Es scheint, dass Xcode 6.4 (und möglicherweise auch einige der Beta 7.x-Versionen) nicht wissen, wie die optimierte Version des Datenmodells geladen werden soll, da ich auch die bekomme

2015-10-16 11:11:42.563 MyAppName[1767:599635] CoreData: Failed to load optimized model at path '/var/mobile/Containers/Bundle/Application/D887D60B-FB28-4059-8167-F573460D98F8/MyAppName.app/MyDataModel.momd/MyDataModel3_0Analytics.omo'

Warnung beim Kompilieren mit 6.4. Beim Kompilieren der App mit der neuesten App Store-Version von Xcode (7.0.1) wird diese Warnung jedoch nicht angezeigt. Ich vermute, dass der Grund, warum Maheshs Lösung funktioniert, darin besteht, dass beim erneuten Schreiben des gesamten Schemas die .omo-Datei erstellt wird, nach der die App im App-Bundle sucht.

Die Lösung für mich bestand darin, eine neue Datenmodellversion in Kerndaten zu generieren und dann mit Xcode 7 zu erstellen. Beim Erstellen einer neuen Modellversion wird anscheinend die optimierte Modelldatei erstellt. In meinen Tests löst Xcode 6.4 auch mit dieser erstellten Datei den Fehler aus. Erst als ich es mit Xcode 7.0.1 versuchte, verschwand die Warnung.

Dies ist eine Spekulation, aber ich denke, wenn Sie ein vorhandenes Projekt haben und keine neue Datenmodellversion erstellt und mit Xcode 7 erstellt haben, dass die .omo-Datei fehlt, wird die Warnung ausgegeben, da die Datei nicht gefunden werden kann. Wenn Sie jedoch Ihr Datenmodell versioniert und mit Xcode 6.4 erstellt haben, scheint es, dass die frühere Xcode-Version mit der optimierten Version etwas nicht richtig macht und es nicht lädt, selbst wenn es dort ist. Dies sind jedoch nur meine Beobachtungen.

Ich habe überprüft, ob ich ein optimiertes Modell (.omo-Datei) zum Laden hatte, indem ich Folgendes getan habe: 1. Archivieren Sie Ihr Projekt 2. Ändern Sie die Erweiterung .ipa in .zip 3. Erweitern Sie Ihre Zip-Datei 4. Klicken Sie auf den Ordner "payload" Klicken Sie mit der rechten Maustaste (oder einem Cmd-Klick) auf das App-Bundle im Ordner und wählen Sie "Paketinhalt anzeigen". 5. Klicken Sie auf das Verzeichnis .momd. Dort sollten alle verfügbaren verwalteten Objektmodelle angezeigt werden.

Wenn Sie nur .mom-Dateien und keine .omo-Dateien haben, ist die Warnung absolut sinnvoll. Die App kann keine nicht vorhandene Datei öffnen.

In meinen Tests scheint die Warnung nur zur Information gedacht zu sein. Ich hatte nie einen Absturz. Es scheint, als würden Kerndaten versuchen, zuerst das optimierte Modell zu laden, und wenn dies fehlschlägt, greifen Sie auf das reguläre .momd-Modell zurück. Dies ist jedoch nur meine Spekulation.

Ich bin mir nicht sicher, ob hier alles völlig korrekt ist. Dies ist genau das, was ich bisher beim Versuch, dies zu debuggen, beobachtet habe. Wenn jemand anderes weitere Informationen beitragen kann, begrüße ich Ihre Eingabe.

digitalHound
quelle
"Bei meinen Tests schien die Warnung nur zur Information gedacht zu sein. Ich hatte nie einen Absturz." Ich habe die gleiche Erfahrung: Ich bekomme die Warnung von Xcode 6, aber alles funktioniert gut. Ich habe ein bisschen Angst, die App mit dieser Warnung an den App Store zu senden, und ich kann sie nicht mit Xcode 7 erstellen. Sind wir sicher, dass dies nur eine Warnung ist und keine Abstürze auftreten werden?
cdf1982
1
Ich habe mit Xcode 7 erstellt, daher ist der Fehler nicht mehr aufgetreten, aber in der Version, die ich mit Xcode 6 ausgeliefert habe, sind keine Abstürze aufgetreten. Wenn Sie auftretende Abstürze nachverfolgen möchten, würde ich empfehlen das Fabric / Crashlytics-Framework von Twitter.
DigitalHound
4

Ich bin heute Morgen auf dieses Problem gestoßen. Habe einen kleinen Hack gemacht, um es zum Laufen zu bringen. Ich denke, es hat etwas mit Versionsfehlanpassungen zu tun, aber ich bin mir nicht sicher.

Wenn Sie eine Momd-Datei laden, fügen Sie der NSURL einfach einen "/[filename‹.mom" hinzu, damit sie funktioniert.

In meinem Fall habe ich die Datei Countly.momd geladen und am Ende Folgendes getan:

// Original loading
NSURL modelURL = [[NSBundle bundleForClass:[CountlyDB class]] URLForResource:@"Countly" withExtension:@"momd"];

// Small hack
modelURL = [modelURL URLByAppendingPathComponent:@"Countly.mom"];

Update: Ich habe einen POD verwendet, der CoreData verwendet. Durch Entfernen des Pods und Hinzufügen der Quelle usw. aus dem Repo wurde das Problem direkt behoben.

Es könnte also ein Pod-Problem sein.

DiAvisoo
quelle
2
Hey - das ist mir und wahrscheinlich einer Menge anderer Leser unklar. Können Sie erklären, wie Sie den Pod entfernen und die Quelle aus dem Repo hinzufügen (wo Sie ihn bekommen, was Sie tun müssen usw.)? Dieser Fehler ist ein großes Problem und dieser Beitrag scheint das einzige zu sein, bei dem Sie etwas getan haben, das für Sie funktioniert hat. Wenn Sie näher darauf eingehen könnten, würden wir uns freuen.
kneuben_studdard
9
Ja im Ernst. Ich erhalte eine Fehlermeldung beim Verwenden des Pods von GoogleMaps und dies geschieht - /GoogleMaps.bundle/GMSCacheStorage.momd/Storage.omo '
Durazno
Verwenden Sie MagicalRecord? Könnte dies mit MR + CocoaPods zusammenhängen?
Buju
1
Diese Antwort ist FALSCH. Das Problem hat nichts mit Pod zu tun. Verschwenden Sie keine Zeit damit, dies auszuprobieren!
Durazno
1
@ DiAvisoos "kleiner Hack" hat mir das Leben gerettet. Ich habe dieses Pod-Problem nicht, über das ihr gesprochen habt (ich komme aus der Zukunft 2017). Ich habe jedoch versucht, die Abwärtskompatibilität in einer in Xcode 9 für eine iOS 9.3+ -Anwendung erstellten Core Data-App zu erhöhen. Die schnelle 3-Version von DiAvisoos "kleinem Hack" löste mein "großes" Problem: {code} let ios9modelURL = modelURL? .AppendingPathComponent ("Countly.mom") {code}.
Rob
3

Ich habe eine Lösung dafür gefunden. Ich habe das gesamte Schema neu geschrieben, und als ich den Code ausführte, wurden diese Warnungen aus den Kerndaten entfernt.

Ich schlage vor, dass Sie eine Sicherungskopie erstellen, bevor Sie dies versuchen.

Hoffe es hilft dir.

Mahesh
quelle
1
Ja, ich habe das Schema neu geschrieben.
Mahesh
9
Entschuldigung, aber wie wird das Schema umgeschrieben?
Markus
3

Nach langer Suche war es einfach so:

public lazy var persistentContainer: NSPersistentContainer = {

    var modelURL = Bundle(for: type(of: self)).url(forResource: "Model", withExtension: "momd")!

    // ===> here you append the nameOfVersion.mom you created
    modelURL.appendPathComponent("Model 2.mom")
    let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL)
    let container = NSPersistentContainer(name: "ModelFile", managedObjectModel: managedObjectModel!)

    container.persistentStoreDescriptions.first?.shouldInferMappingModelAutomatically = false

 ...
Brahimm
quelle
Was ist der Grund dafür shouldInferMappingModelAutomatically = false?
25.
Dies gilt für Migrationen, wenn Sie mehrere Versionen von Ihrem haben Model. Wenn Sie dies nicht
tun,
0

Ich möchte Leuten antworten, die darauf gestoßen sind, als sie einen eigenen Pod mit eigenen CoreData-Modellen geschrieben haben. Wahrscheinlich haben Sie Ihre Modelldefinition in das Bundle eingefügt (das ist gut), aber Sie suchen nach der momdDatei im falschen Bundle.

Angenommen, Sie haben Ihr Bundle in podspec folgendermaßen definiert:

'MYPodBundle' => [
    'Model/*.{xcdatamodeld,xcdatamodel}'
]

Dann sollten Sie zuerst dieses Bundle finden und dann Ihr Modell darin finden .

NSURL *bundleURL = [[NSBundle bundleForClass:[MYEntity class]] URLForResource:@"MYPodBundle" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
NSString *modelPath = [bundle pathForResource:@"MYCoreDataModel" ofType:@"momd"];
NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];

So können Sie den CoreData-Stack weiter erstellen.

// Dies mag ein bisschen unauffällig sein, weil Sie keinen eigenen Pod geschrieben haben, aber Ihre Antwort ist ganz oben auf Google.

Wiedererkennung
quelle