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