’+ entityForName: nil 不是合法的 NSManagedObjectContext 参数-Core Data

我已经将所有相关的代码添加到了应用程序代理中,并且我能够添加到数据模型中,并从 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''

有人知道这是怎么回事吗? 如果有人能帮忙就太好了。

48523 次浏览

我忘了将上下文传递给视图控制器。

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

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

如果您使用的是接续语,那么如果您不将上下文一直传递下去,也会遇到同样的问题。在启动 segue 的 prepareForSegue 方法中使用此代码:

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

当然,前提是您将上下文保存在一个名为“ managedObjectContext”的属性中。

你应该把这个添加到 viewController:

 id delegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = [delegate managedObjectContext];

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

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

我遇到了这个问题,一个同事帮我解决了: “ entityForName: nil 不是搜索实体名称的合法 NSManagedObjectContext 参数”。并且您对核心数据模型进行了更改。我认为问题 可能不是密码

解决方法可以很简单,试试下面的方法:

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

希望能有帮助。

在我的案例中,.xcdatamodeld在应用代理中被贴错了标签:

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

我是惰性初始模式的粉丝。这样,如果你需要为测试注入一个新的上下文,你可以这样做,或者如果你在那里设置你的 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;
}