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.
Antworten:
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.
quelle
Ich hatte vergessen, den Kontext an den View Controller zu übergeben. Anfängerfehler.
quelle
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];
quelle
Sie sollten dies Ihrem viewController hinzufügen:
id delegate = [[UIApplication sharedApplication] delegate]; self.managedObjectContext = [delegate managedObjectContext];
quelle
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:
Ich hoffe es hilft.
quelle
In meinem Fall wurde das
.xcdatamodeld
im AppDelegate falsch beschriftet:let container = NSPersistentContainer(name: "name of data model")
quelle
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];
quelle
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; }
quelle