【问题标题】:'+entityForName: nil is not a legal NSManagedObjectContext parameter - Core Data'+entityForName: nil 不是合法的 NSManagedObjectContext 参数 - 核心数据
【发布时间】:2012-07-20 17:48:12
【问题描述】:

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

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

【问题讨论】:

  • 我认为上下文是零。确保 [self managedObjectContext] 没有返回 nil
  • 请注意,如果您将 ivar 传递给 ManagedObjectContext 而不是使用 getter 方法,则会出现此错误

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


【解决方案1】:

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

【讨论】:

  • 这是将上下文传递给视图控制器的方法: AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];上下文 = [appDelegate managedObjectContext];
【解决方案2】:

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

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

【讨论】:

  • 感谢这个漂亮的小 sn-p.. 我永远记不住完整的语法!
【解决方案3】:

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

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

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

【讨论】:

  • 我将它设置为 _managedObjectContext 并且它崩溃了。 self.mangeObjectContext 解决它。谢谢!
  • 很高兴它有效!我相信,发布 Xcode 4.4,如果你只使用“@synthesize myProperty;”编译器创建一个名为“myProperty”而不是“_myProperty”的实例变量。如果你根本不使用“@synthesize”,你会得到“_myProperty”。所以“_managedObjectContext”可能实际上并不存在。我不知道,因为我看不到你的代码。 "self.managedObjectContext" 是安全的,因为它会像往常一样调用访问器。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

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

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

    希望对你有帮助。

    【讨论】:

      【解决方案6】:

      在我的情况下,.xcdatamodeld 在 AppDelegate 中被错误标记:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          我是惰性初始化的粉丝。这样,如果你需要注入一个新的上下文进行测试,你可以,或者如果你在那里设置你的 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-10-18
            • 1970-01-01
            • 1970-01-01
            • 2015-07-06
            • 2014-09-28
            • 1970-01-01
            • 2013-12-26
            • 2014-02-23
            相关资源
            最近更新 更多