'+ entityForName:nil不是合法的NSManagedObjectContext参数 - 核心数据

时间:2012-07-21 22:59:47

标签: objective-c ios xcode exception core-data

我已将所有相关代码添加到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''

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

8 个答案:

答案 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模型中做了改变。我认为问题可能不是代码

解决方案很简单。尝试以下选项之一:

  • 只需从您正在测试的设备中删除该应用,它应该具有旧版本的模型。
  • 使用Xcode创建另一个数据库版本,>编辑器>添加模型版本。

希望它有所帮助。

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