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


72

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

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


12
我认为背景是零。确保[selfmanagedObjectContext]不返回nil
mask8 2012年

1
出于后人的需要,如果为
ManagedObjectContext

Answers:


37

如果您使用的是segues,那么如果您不通过上下文传递上下文,也会遇到相同的问题。在启动segue的类的prepareForSegue方法中使用以下代码:

[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];

假设您将上下文保存在一个名为“ managedObjectContext”的属性中。


1
我将其设置为_managedObjectContext并崩溃。self.mangeObjectContext解决它。谢谢!
LE SANG 2015年

很高兴它有效!我相信,如果您仅使用“ @synthesize myProperty;”,请发布Xcode 4.4。编译器将创建一个名为“ myProperty”而不是“ _myProperty”的实例变量。如果根本不使用“ @synthesize”,则会得到“ _myProperty”。因此,“ _ managedObjectContext”可能实际上不存在。我不知道,因为我看不到您的代码。“ self.managedObjectContext”是安全的,因为它会像以往一样调用访问器。
蒂姆(Tim)

46

我忘记了将上下文传递给视图控制器。新秀错误。


这是将上下文传递给视图控制器的方法:AppDelegate * appDelegate =(AppDelegate *)[[UIApplication sharedApplication] delegate]; context = [appDelegatemanagedObjectContext];
Syed Asad Ali

45

在开始从数据库中获取数据之前,可以通过包含以下代码来传递上下文:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];

感谢您提供这个漂亮的小片段。.我记不清完整的语法了!
RyanG


2

我遇到了这个问题,一位同事帮助了我。如果收到此错误消息:“ entityForName:nil不是搜索实体名称的合法NSManagedObjectContext参数”。然后您对核心数据模型进行了更改。我认为问题可能不是代码

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

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

希望能帮助到你。


2

就我而言.xcdatamodeld,在AppDelegate中贴错了标签:

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

0

如果目标视图控制器嵌入在NavigationController中,则需要按以下方式适当设置上下文:

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

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;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.