73

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

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

4

8 回答 8

46

我忘记将上下文传递给视图控制器。菜鸟错误。

于 2012-07-21T23:26:23.127 回答
45

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

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];
于 2012-11-24T05:53:50.623 回答
37

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

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

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

于 2012-12-26T16:09:32.530 回答
20

你应该把它添加到你的viewController:

 id delegate = [[UIApplication sharedApplication] delegate];
    self.managedObjectContext = [delegate managedObjectContext];
于 2013-01-20T07:53:40.290 回答
2

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

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

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

希望能帮助到你。

于 2014-05-27T17:31:14.003 回答
2

在我的情况下,.xcdatamodeld在 AppDelegate 中被贴错标签:

 let container = NSPersistentContainer(name: "name of data model")
于 2017-01-15T17:06:55.893 回答
0

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

  self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0];
 [self.mydetailViewController setManagedObjectContext:self.managedObjectContext];
于 2014-03-14T17:08:04.063 回答
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;
    }
于 2017-01-20T15:09:02.960 回答