'+entityForName: nil не является законным параметром NSManagedObjectContext-Core Data
Я добавил весь соответствующий код в делегат приложения, и я могу добавить в модель данных и извлечь из модели данных в applicationDidFinishLaunchingWithoptions.
моя проблема возникает, когда я пытаюсь записать в модель данных в моем контроллере представления. Я добавил этот код в заголовочный файл:
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
и этот код в мой файл реализации:
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]);
}
однако, я получаю следующую ошибку:
'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Events''
кто-нибудь знаешь, что происходит? Любая помощь будет оценена по достоинству.
8 ответов:
Если вы используете сегменты, вы получите те же проблемы, если вы не передадите контекст вниз по строке. Используйте этот код в методе prepareForSegue класса, инициирующего segue:
[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
это предполагает, что вы держите свой контекст в свойстве под названием "managedObjectContext", конечно.
вы можете передать контекст, включив следующий код, прежде чем начать извлекать данные из базы данных:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate]; context = [appDelegate managedObjectContext];
вы должны добавить это в свой viewController:
id delegate = [[UIApplication sharedApplication] delegate]; self.managedObjectContext = [delegate managedObjectContext];
Я получил эту проблему и коллега помог мне. Если вы получили это сообщение об ошибке: "entityForName: nil не является юридическим параметром NSManagedObjectContext, ищущим имя сущности". И вы внесли изменения в свою модель coredata. Я думаю, что проблема может быть не код.
решение может быть простым. Попробуйте один из этих вариантов:
- просто удалите приложение с устройства, которое вы тестируете, оно должно иметь старую версию вашей модели.
- создать другую версию базы данных с помощью Xcode, > редактор>добавить версию модели.
надеюсь, что это помогает.
в моем случае
.xcdatamodeld
был неправильно помечен в AppDelegate:let container = NSPersistentContainer(name: "name of data model")
если контроллер вида назначения встроен в NavigationController, контекст должен быть установлен соответствующим образом следующим образом -
self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0]; [self.mydetailViewController setManagedObjectContext:self.managedObjectContext];
Я поклонник ленивой инициализации. Таким образом, если вам нужно ввести новый контекст для тестирования, вы можете, или он получит его контекст от делегата приложения, если вы настроите свой MOC там.
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; }