我已将所有相关代码添加到App Delegate,我可以添加到数据模型并从applicationDidFinishLaunchingWithOptions中的数据模型中获取。
当我尝试在View Controller中写入数据模型时出现问题。我已将此代码添加到头文件中:
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''
有谁知道发生了什么事?任何帮助将不胜感激。
答案 0 :(得分:46)
我忘了将上下文传递给视图控制器。菜鸟错误。
答案 1 :(得分:45)
在开始从数据库中获取数据之前,您可以通过包含以下代码来传递上下文:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];
答案 2 :(得分:37)
如果你正在使用segues,如果你没有传递上下文,你将会遇到同样的问题。在启动segue的类的prepareForSegue方法中使用此代码:
[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
这假设您将上下文保存在名为“managedObjectContext”的属性中。
答案 3 :(得分:20)
你应该把它添加到你的viewController:
id delegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = [delegate managedObjectContext];
答案 4 :(得分:2)
我遇到了这个问题,一位同事帮助了我。如果您收到此错误消息: " entityForName:nil不是合法的NSManagedObjectContext参数,用于搜索实体名称"。你在coredata模型中做了改变。我认为问题可能不是代码。
解决方案很简单。尝试以下选项之一:
希望它有所帮助。
答案 5 :(得分:2)
在我的案例中,.xcdatamodeld
在AppDelegate中被错误标记:
let container = NSPersistentContainer(name: "name of data model")
答案 6 :(得分:0)
如果目标视图控制器嵌入在NavigationController中,则需要按以下方式正确设置上下文 -
self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0];
[self.mydetailViewController setManagedObjectContext:self.managedObjectContext];
答案 7 :(得分:0)
我是懒惰初始化的粉丝。这样,如果您需要为测试注入新的上下文,或者如果您在那里设置了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;
}