'+ entityForName: nil не является законным параметром NSManagedObjectContext - Основные данные
Я добавил весь соответствующий код в App Delegate, и я могу добавить в модель данных и извлечь из модели данных в 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''
Кто-нибудь знает, что происходит? Любая помощь будет оценена.
Ответы
Ответ 1
Если вы используете segues, вы получите те же проблемы, если не передадите контекст по строке. Используйте этот код в методе prepareForSegue класса, инициирующего segue:
[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
Это предполагает, что вы сохраняете свой контекст в свойстве под названием "managedObjectContext".
Ответ 2
Я забыл передать контекст контроллеру вида. Ошибка новичков.
Ответ 3
Вы можете передать контекст, включив следующий код, прежде чем приступить к извлечению данных из базы данных:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];
Ответ 4
вы должны добавить это в свой viewController:
id delegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = [delegate managedObjectContext];
Ответ 5
У меня эта проблема, и коллега помог мне. Если вы получили это сообщение об ошибке:
"entityForName: nil не является законным параметром NSManagedObjectContext, ища имя сущности". И вы внесли изменения в модель coredata. Я думаю, что проблема может быть не кодом.
Решение может быть простым. Попробуйте один из следующих вариантов:
- Просто удалите приложение с устройства, которое вы тестируете, оно должно иметь старую версию вашей модели.
- Создайте другую версию базы данных с помощью Xcode, > Редактоp > Добавить версию модели.
Надеюсь, что это поможет.
Ответ 6
Если контроллер представления назначения встроен в NavigationController, контекст должен быть установлен соответствующим образом следующим образом:
self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0];
[self.mydetailViewController setManagedObjectContext:self.managedObjectContext];
Ответ 7
В моем случае .xcdatamodeld
был неверно отмечен в AppDelegate:
let container = NSPersistentContainer(name: "name of data model")
Ответ 8
Я поклонник ленивой инициализации. Таким образом, если вам нужно ввести новый контекст для тестирования, вы можете получить его из делегата приложения, если вы настроили там свой 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;
}