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

有谁知道发生了什么事? 任何帮助,将不胜感激。

如果你使用segues,你将会遇到同样的问题,如果你没有把上下文传递下去。 在启动segue的类的prepareForSegue方法中使用此代码:

 [[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参数search实体名称”。 你在coredata模型中做了改变。 我认为这个问题可能不是代码

解决scheme可以很简单。 尝试其中一个选项:

  • 只要从您正在testing的设备中删除应用程序,它应该有您的模型的旧版本。
  • 使用Xcode创build另一个数据库版本,> Editor> Add Model Version。

希望它有帮助。

如果目标视图控制器embedded在NavigationController中,则需要按照以下方式正确设置上下文 –

  self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0]; [self.mydetailViewController setManagedObjectContext:self.managedObjectContext]; 

在我的情况下, .xcdatamodeld被错误标记在AppDelegate中:

  let container = NSPersistentContainer(name: "name of data model") 

我是懒惰初始化的粉丝。 这样如果你需要注入一个新的上下文进行testing你可以,或者如果你在那里设置你的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; }