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?
Antworten:
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.
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.
quelle
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.
quelle
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.
quelle
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 ...
quelle
shouldInferMappingModelAutomatically = false
?Model
. Wenn Sie dies nichtIch 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
momd
Datei 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.
quelle