Ich hatte meinen ersten Riss bei Core Data und erhalte die folgende Fehlermeldung, wenn ich meinen Code auf meinem Gerät ausführe, aber er funktioniert auf dem Simulator einwandfrei.
* Beenden der App aufgrund der nicht erfassten Ausnahme 'NSInvalidArgumentException', Grund: 'NSPersistentStoreCoordinator kann nicht mit einem Nullmodell erstellt werden'
Einige meiner Methoden, die das Problem verursachen könnten:
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
__managedObjectContext = [[NSManagedObjectContext alloc] init];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
/**
Returns the managed object model for the application.
If the model doesn't already exist, it is created from the application's model.
*/
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil)
{
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}
/**
Returns the persistent store coordinator for the application.
If the coordinator doesn't already exist, it is created and the application's store added to it.
*/
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil)
{
return __persistentStoreCoordinator;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"RugbyOnTV.sqlite"];
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
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();
}
return __persistentStoreCoordinator;
}
- (NSString *)applicationDocumentsDirectory {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
}
BEARBEITEN
Ich habe die ManagedObjectContext-Methode (unten) aus Apples CoreDataBooks kopiert und eingefügt und sie funktioniert jetzt. Ich bin mir nicht sicher, warum
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
objective-c
ios
core-data
Dominic Williams
quelle
quelle
NSString *basePath = [paths firstObject];
Antworten:
Ich hatte genau die gleiche Fehlermeldung wie der ursprüngliche Beitrag. Ich habe stundenlang damit gerungen. Es war diese Zeile in meinem AppDelegate.m.
Für alle da draußen, die diese Fehlermeldung suchen und diesen Thread finden ... versuchen Sie dies zuerst.
Sie müssen sicherstellen, dass dort, wo es steht [dasselbe mit dem Namen xcdatamodeld] .... dass es ist !!! Aus irgendeinem Grund hatte ich meinen Projektnamen und nicht den Namen des Datenmodells.
Änderte es und es funktionierte sofort .....
Vielen Dank an Rock & Muller für ihren Beitrag ....... du hast mir Tage gerettet !!
Gaz.
quelle
blah
vonblah.xcdatamodeld
. Vielen Dank, dass Sie Internet und Stackoverflow.Überprüfen Sie zuerst:
Wenn Sie einen Nullwert erhalten, liegt das Problem möglicherweise hier
Versuchen Sie also, @ "momd" durch @ "mom" zu ändern.
quelle
modelURL
ist auchnil
. Die häufigste Ursache ist ein TippfehlerRugbyOnTv
. Beachten Sie, dass hier zwischen Groß- und Kleinschreibung unterschieden wird.Ich habe ein seltsames Problem mit Xcode 4.3.2 und iOS 5 festgestellt.
gibt aber eine gültige URL zurück
Gibt ein null NSManagedObjectModel zurück. Nach Überprüfung der Dokumentation scheint NSManagedObjectModel jedoch eine Datei zu benötigen, in der NAME_OF_THE_MODEL.momd ein Verzeichnis ist, das eine NAME_OF_THE_MODEL.mom-Datei enthält. Ändern der URL in
dann funktioniert. Scheint seltsam, dass Xcode Code generiert, der nicht mit sich selbst funktioniert ...
quelle
Ich hatte dieses Problem und das Ändern von "Mütter" zu "Mutter" hat nichts getan. Um das Problem zu beheben, musste ich mit der rechten Maustaste auf die Datei xcdatamodelId klicken> Paketinhalt anzeigen und dann die versteckte .xcurrentversion-Datei löschen.
PS: Dieses Problem trat erst auf, nachdem ich den Namen der Datenmodelldatei geändert hatte.
quelle
Eine weitere Ursache für diesen Fehler ist, dass Xcode das Datenmodell manchmal nicht in den Build einbezieht.
Überprüfen Sie die Erstellungsphasen Ihres Ziels und stellen Sie sicher, dass die Datei * .xcdatamodeld im Abschnitt Quellen kompilieren enthalten ist.
quelle
Was wahrscheinlich passiert ist, ist, dass Ihre xcdatamodeld-Datei aus Apples Quellcode in eine xcdatamodel-Datei (ohne das d) umgewandelt wurde und daher nicht als gleich angesehen wird.
Der schnellste Weg, dies zu beheben, besteht darin, die xcdatamodel-Datei in Ihrem Projektnavigator und in der Menüleiste auszuwählen
Editor->Add Model Version...
und fügen Sie eine neue Version Ihres Modells hinzu. Nehmen Sie alle Änderungen an der neuen Version vor.
Dies funktioniert in Xcode 5
quelle
Ich löse es, indem ich die DB-Datei zum hinzufüge
Copy Bundle Resources
.Gehen Sie zum Stammverzeichnis Ihres Projekts >> wählen Sie Ihr Ziel aus >> Phasen erstellen >> Bundle-Ressourcen kopieren. Stellen Sie sicher, dass Ihre xcdatamodeld-Datei hier hinzugefügt wurde.
Keine der veröffentlichten Lösungen hat bei mir funktioniert. Hoffentlich hilft dieser Beitrag jemandem da draußen. Meine App stürzt übrigens nur in Release-Builds ab. Lektion gelernt. Testen Sie immer Release Builds!
Übrigens fand ich diesen SO-Beitrag am hilfreichsten unter https://stackoverflow.com/a/6708837/951349 .
quelle
Ich habe das gleiche Problem mit @Dominic Williams
Versuchen Sie, den Namen der Momd-Datei unten zu ändern (dies finden Sie
managedObjectModel
standardmäßig in der Methode). Dies entspricht der von[file name].xcdatamodeld
Ihnen erstellten Datei:quelle
Ich hatte das gleiche Problem. Die Lösung war eine Mischung aus 2 Antworten:
1) Ich musste dem URLForResource-Aufruf den Parameter "Unterverzeichnis" hinzufügen
2) Aus einem mir unbekannten Grund wurde das Datenmodell beim Kompilieren des Projekts nicht berücksichtigt. Ich musste es manuell in die "Phasen erstellen / Ressourcen kompilieren" einfügen.
Mit nur einer der oben genannten Lösungen funktionierte meine Anwendung nicht.
quelle
Die Lösung für das Problem, von dem Sie sprechen, ist einfach. Ändern Sie die Dateierweiterung in der Modell-URL in "mom" anstelle von "momd". Getan.
quelle
Ich habe hier alle Lösungen ausprobiert, und keine davon hat funktioniert. Mein Problem trat auf, nachdem ich das Projekt umbenannt hatte. Anscheinend sucht Xcode während der Kompilierung weiterhin an der falschen Stelle nach der alten Momd-Datei.
Wenn Sie alle oben genannten Lösungen ohne Erfolg ausprobiert haben, überprüfen Sie den vollständigen Pfad Ihrer
.xcdatamodeld
Datei. Das hat bei mir funktioniert.quelle
Ich hatte das gleiche Problem, es funktionierte gut unter iOS6, aber nicht unter iOS5. So habe ich es gelöst:
.xcdatamodeld
, öffnen Sie das Editor-Menü und klicken Sie auf "Modellversion hinzufügen ...").xcdatamodeld
unter Versionierte Kerndatenmodell).xcdatamodeld
Datei in xcode.xcdatamodeld
Datei im Finder und wählen Sie "Paketinhalt anzeigen"..xcdatamodel
, das Sie nicht möchten.xcdatamodeld
Fügen in xcode erneut hinzu(Hier habe ich herausgefunden, wie man eine Modellversion löscht: Wie man eine alte / nicht verwendete Datenmodellversion in Xcode löscht )
quelle
Ich löse das Problem, ohne Code zu ändern.
Ich füge die ModelName.xcdatamodeld über Datei-> Datei hinzufügen hinzu, anstatt die Datei in den Xcode zu ziehen.
quelle
Meinerseits war das Problem, dass ich die Groß- und Kleinschreibung einiger Zeichen im Datenbanknamen geändert hatte.
Beim Starten eines neuen Projekts richtet Xcode automatisch alles aus dem Projektnamen ein. Wenn Sie anfingen, Ihr Projekt "Rugbyontv" zu nennen und später beschlossen, zu "RugbyOnTV" zu wechseln und eine Suche und Ersetzung durchführten, würde dies das Problem lösen. (Dank an Rob für den Hinweis, dass bei dem Namen zwischen Groß- und Kleinschreibung unterschieden wird)
quelle
Ich habe stundenlang nach einer Antwort gesucht und nichts hat funktioniert. Aber dann habe ich plötzlich diesen Artikel gefunden . Demnach bestand das Problem darin, den Root-Controller in diesem Teil von AppDelegate.m festzulegen:
In der Tat sollten Sie definieren, welcher Root-Controller Ihre CoreData-Verbindung delegieren soll. In meinem Fall war ein TabBarController mit anderen Ansichten verbunden, sodass mein Root-Controller für Zielansichten als TabBar definiert wurde und einen Fehler verursachte. ich habe mich verändert
zu
und alles hat funktioniert.
quelle
Ich weiß, dass dies Ihr Problem nicht löst, aber ich bin gestern auf dieses Problem gestoßen, das mich stundenlang plagte. Die von @Dominic Williams veröffentlichte Lösung gab mir eine ArrayIndexOutOfBoundsException (unabhängig vom Objective-C-Äquivalent).
Ich bin noch nicht sehr gut mit Objective-C / Xcode, aber ich arbeite an einer iOS-App, die unser Unternehmen (meistens) extern entwickelt hat. Leider vergaßen sie oft die Verwendung einer Tastatur und verwendeten Großbuchstaben austauschbar oder buchstabierten Eigenschaften falsch, waren aber zu faul, um zurück zu gehen und sie zu ändern. Sie hatten einen Großbuchstaben im xcode-Projektnamen verwendet, wo er eigentlich nicht sein sollte (unser Produktname verwendet kein Großbuchstaben), und ich musste zurückgehen und jedes Vorkommen dieses Großbuchstabens in einen Kleinbuchstaben ändern ;; Dazu gehörten der Projektname, die Kerndatendatei, Hunderte von Variablen usw.
Sobald ich dies getan hatte, stieß ich auf diesen Fehler und keine Lösung konnte ihn für mich beheben. Ich hatte sichergestellt, dass alle URL-Namen korrekt waren, das Projekt bereinigt, die App deinstalliert, das Telefon neu gestartet usw., ohne Erfolg. Ich gab auf und schaltete meinen Mac aus und ging für den Tag nach Hause. Zu meiner Überraschung kam ich heute Morgen zurück und alles schien gut zu funktionieren!
Ich habe keine Ahnung, warum dies funktioniert hat, aber wenn Sie nicht weiterkommen, starten Sie Ihren Mac neu.
quelle
Wenn jemand wegen des gleichen Problems feststeckt. Stellen Sie sicher, dass Sie die Datenbank ordnungsgemäß verknüpft haben (da Sie den Code möglicherweise direkt aus einem Beispiel kopiert haben).
Aktualisieren Sie einfach den Namen der Datenbank in den MethodenagedObjectModel und persistentStoreCoordinator in AppDelegate.
quelle
Ich hatte das gleiche Problem, dh
gab nil zurück, da keine .momd-Datei generiert wurde.
Der Grund war, dass xcode im App-Verzeichnis (z. B. MyGreatApp / MyGreatApp.app) MyModel.xcdatamodeld kopiert hatte, anstatt MyModel.momd aus der Datei MyModel.xcdatamodeld (mit momc) zu generieren.
Die Lösung bestand darin, den Verweis auf MyModel.xcdatamodeld im XCode-Projektbrowser zu löschen und ihn aus dem Finder zurück in das Projekt zu ziehen. Nachdem dieser xcode erkannt hatte, dass er zu einer .momd kompiliert werden musste.
quelle
Ich hatte dieses Problem aus dem Nichts, nachdem ich die generierte App in der gelöscht hatte
~/Library/Application Support/iPhone Simulator
. Irgendwie führte dies dazu, dass nachfolgende Builds im Simulator und auf Geräten fehlschlugen. Hatte seit Ewigkeiten nichts an CoreData geändert, aber es würde mit dem scheiternCannot create an NSPersistentStoreCoordinator with a nil model
. Versuchte ein paar Dinge oben und nichts funktionierte.Ich konnte den generierten Momd-Ordner mit der darin enthaltenen Mom-Datei sehen. Die App im Simulator konnte beide sehen, konnte jedoch die SQLite-Datei nicht generieren.
Was es löste, war das Hinzufügen eines Attributs zu einer Entität in meiner xcdatamodeld-Datei in Xcode und das sofortige Löschen. Ich hatte gehofft, dass dies Xcode dazu bringen würde, alles, was das Problem verursachte, von Grund auf neu zu generieren, und es schien zu funktionieren. Immer noch nicht klar, was eigentlich falsch war, aber meine App läuft jetzt wieder im Simulator und auf den Geräten.
quelle
Ich hatte gerade ein ähnliches Problem beim Upgrade von IOS5 auf IOS6. Es stellte sich heraus, dass beim Modellnamen zwischen Groß- und Kleinschreibung unterschieden wurde.
Ich bin mir nicht sicher, ob dies jemandem hilft.
quelle
Siehe auch diesen Thread: Unit Test kann die Core Data-Modelldatei nicht finden
Es hat mir geholfen, das Problem zu lösen - das nur beim Unit-Testing auftrat
quelle
Okay, ich werde zuerst eine halbe Lösung nennen, die funktioniert, wenn Sie die App neu installieren (im Simulator oder Debugger-Gerät). Aber das ist sicher keine echte Lösung. Wenn Sie beispielsweise Ihre Anwendung aktualisieren, tun Sie dies NICHT. Andernfalls kann Ihre neue Version abstürzen, da Benutzer sie nicht erneut installieren. Stattdessen verwenden sie die Schaltfläche "Aktualisieren".
Wie ich verstanden habe, tritt dieses Problem hauptsächlich auf, wenn Sie den Dateinamen des Datenmodells ändern. Der Grund könnte folgender sein :
. Wenn Sie die App zum ersten Mal ausführen, wird eine Datenmodelldatei im App-Bundle wie "data_model_1" erstellt. Diese Erstellung erfolgt nur zum ersten Mal.
. Wenn Sie den Dateinamen aktualisieren und die App erneut ausführen, kann sie nicht gefunden werden, da noch die Datei "data_model_1" vorhanden ist, Sie sie jedoch anweisen, nach "data_model_2" zu suchen. Wie kann es finden, es hat es noch nicht erstellt und wird es nicht, es sei denn, Sie installieren die App nicht mit neuem Dateinamen.
Wenn dies also die erste Version Ihrer App ist und eine Neuinstallation auf einem Simulator oder Gerät Ihrem Projekt keinen Schaden zufügt, versuchen Sie es. Else, überprüfen Kerndatenmodell Versionierung und Datenmigrationsleitfaden auf iOS Developer Library, vielleicht ist es das, was Sie brauchen.
Bearbeiten: Wenn die Neuinstallation nicht funktioniert, versuchen Sie zuerst, das Projekt zu deinstallieren, dann zu bereinigen, dann alles zu schließen, das Projekt erneut zu öffnen und Build + Run auszuführen. Das sollte funktionieren.
quelle
Wenn Ihr Projekt auf dem Simulator, aber nicht auf dem Gerät funktioniert, versuchen Sie, den Release-Build auf Ihrem Gerät anstelle des Debug-Builds auszuführen.
Wählen Sie Ihr Projekt -> Produkt -> Schema bearbeiten -> Konfiguration erstellen [DEBUG -> RELEASE]
Führen Sie nun das Projekt erneut aus, es wird funktionieren.
quelle
Ich bin auch mit diesem Problem konfrontiert, aber wenn ich die
ModelName.xcdatamodeld
Datei ändere, funktioniert es. Ich denke, dieModelName.xcdatamodeld
Datei wurde nicht richtig hinzugefügt. Überprüfen und bereinigen Sie die App und führen Sie sie aus.quelle
Nachdem ich das Namensproblem behoben hatte, blieb der Fehler bestehen. Dann funktionierte es nach dem Neustart von Xcode 5. Dies kann automatisch dasselbe tun wie einige der hier angebotenen manuellen Verknüpfungsvorschläge.
quelle
Für mich war das Problem darauf zurückzuführen, dass ich mein Modell aus einem Sandbox-Projekt in mein eigentliches Projekt kopiert habe. Stellen Sie immer sicher, dass Sie Ihr Modell aus dem Projekt heraus generieren, in dem das Modell verwendet wird.
quelle
Ich konfrontierte diesen gleichen Fehler , wenn ich umbenannt die
.xcdatamodel
Datei von Xcode und änderte den umbenannten Namen in AppDelegate wo immer es nötig war, aber ich habe immer noch die gleichen Fehler. Keines der vorgeschlagenen Verfahren hat bei mir funktioniert.Dann öffnete ich den Ordner in
Finder
und fand eine zusätzliche Datei.xccurrentversion
zusammen mit der.xcdatamodel
Datei. Ich habe es in derTextEdit
App geöffnet und dies geändert:Ich verwende dies mit Xcode 6.4, OSX Yosemite 10.10.1
Ich hoffe, es hilft!
quelle