'+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 72

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;
    }