'+ entityForName: nil ist kein zulässiger NSManagedObjectContext-Parameter - Core Data

72

Ich habe dem App-Delegaten den gesamten relevanten Code hinzugefügt und kann ihn in applicationDidFinishLaunchingWithOptions zum Datenmodell hinzufügen und aus dem Datenmodell abrufen.

Mein Problem tritt auf, wenn ich versuche, in das Datenmodell in meinem View Controller zu schreiben. Ich habe diesen Code zur Header-Datei hinzugefügt:

NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

Und dieser Code zu meiner Implementierungsdatei:

NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *model = [NSEntityDescription
                          insertNewObjectForEntityForName:@"Events" 
                          inManagedObjectContext:context];
[model setValue:@"Sample Event" forKey:@"eventName"];

NSError *error;
if (![context save:&error]) {
    NSLog(@"Couldn't save: %@", [error localizedDescription]);
}

Ich erhalte jedoch den folgenden Fehler:

'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Events''

Weiß jemand was los ist? Jede Hilfe wäre dankbar.

Alex Godbehere
quelle
12
Ich denke, der Kontext ist gleich Null. Stellen Sie sicher, dass [self manageObjectContext] nicht nil
mask8
1
Aus Gründen der Nachwelt können Sie diesen Fehler erhalten, wenn Sie den ivar für den ManagedObjectContext übergeben, anstatt die Getter-Methode zu verwenden
Matthemattics

Antworten:

37

Wenn Sie Segues verwenden, treten dieselben Probleme auf, wenn Sie den Kontext nicht weitergeben. Verwenden Sie diesen Code in der prepareForSegue-Methode der Klasse, die den Übergang initiiert:

[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];

Dies setzt natürlich voraus, dass Sie Ihren Kontext in einer Eigenschaft namens "manageObjectContext" halten.

Tim
quelle
1
Ich habe es auf _managedObjectContext gesetzt und es stürzt ab. self.mangeObjectContext löst es. Vielen Dank!
LE SANG
Ich bin froh, dass es funktioniert! Ich glaube, poste Xcode 4.4, wenn du nur "@synthesize myProperty" verwendest. Der Compiler erstellt eine Instanzvariable mit dem Namen "myProperty" anstelle von "_myProperty". Wenn Sie "@synthesize" überhaupt nicht verwenden, erhalten Sie "_myProperty". "_ManagedObjectContext" ist also möglicherweise nicht vorhanden. Ich weiß es nicht, weil ich dich nicht sehen kann. "self.managedObjectContext" ist sicher, da dadurch der Accessor wie immer aufgerufen wird.
Tim
46

Ich hatte vergessen, den Kontext an den View Controller zu übergeben. Anfängerfehler.

Alex Godbehere
quelle
Auf diese Weise können Sie den Kontext an den Ansichtscontroller übergeben: AppDelegate * appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; context = [appDelegate manageObjectContext];
Syed Asad Ali
45

Sie können den Kontext übergeben, indem Sie den folgenden Code einfügen, bevor Sie mit dem Abrufen der Daten aus der Datenbank beginnen:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];
Vishwani
quelle
Vielen Dank für dieses nette kleine Snippet. Ich kann mich nie an die vollständige Syntax erinnern!
RyanG
20

Sie sollten dies Ihrem viewController hinzufügen:

 id delegate = [[UIApplication sharedApplication] delegate];
    self.managedObjectContext = [delegate managedObjectContext];
Hashem Aboonajmi
quelle
2

Ich habe dieses Problem und ein Kollege hat mir geholfen. Wenn Sie die folgende Fehlermeldung erhalten haben: "entityForName: nil ist kein zulässiger NSManagedObjectContext-Parameter, der nach dem Entitätsnamen sucht". Und Sie haben Änderungen an Ihrem Coredata-Modell vorgenommen. Ich denke, das Problem ist möglicherweise nicht der Code .

Die Lösung kann einfach sein. Probieren Sie eine dieser Optionen aus:

  • Löschen Sie einfach die App von dem Gerät, das Sie testen. Sie sollte die alte Version Ihres Modells haben.
  • Erstellen Sie eine andere Datenbankversion mit Xcode> Editor> Modellversion hinzufügen.

Ich hoffe es hilft.

rafaeljuzo
quelle
2

In meinem Fall wurde das .xcdatamodeldim AppDelegate falsch beschriftet:

 let container = NSPersistentContainer(name: "name of data model")
camelCaseUpInYourFace
quelle
0

Wenn der Zielansichts-Controller in einen NavigationController eingebettet ist, muss der Kontext wie folgt entsprechend eingestellt werden:

  self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0];
 [self.mydetailViewController setManagedObjectContext:self.managedObjectContext];
Hackerinheels
quelle
0

Ich bin ein Fan von fauler Initialisierung. Auf diese Weise können Sie, wenn Sie zum Testen einen neuen Kontext einfügen müssen, den Kontext vom App-Delegaten abrufen, wenn Sie dort Ihr MOC einrichten.

class.h
@property (strong, nonatomic,getter=getManagedObjectContext) NSManagedObjectContext *managedObjectContext;

class.m
    -(NSManagedObjectContext *)getManagedObjectContext {
        if (_managedObjectContext) {
            return _managedObjectContext;
        }
        _managedObjectContext = [[(AppDelegate *)[[UIApplication sharedApplication]delegate]sharedDataModel]managedObjectContext];
        return _managedObjectContext;
    }
SpaceTrucker
quelle