【问题标题】:CoreData error: +entityForName: could not locate an NSManagedObjectModel for entity nameCoreData 错误:+entityForName:找不到实体名称的 NSManagedObjectModel
【发布时间】:2011-10-29 08:12:28
【问题描述】:

我已经与CoreData 苦苦挣扎了几天,但我不断收到此错误:

'NSInternalInconsistencyException',原因:'+entityForName:找不到实体名称的 NSManagedObjectModel。

我检查了实体名称和我在代码上写的内容,它们是相同的。我还重新创建了对象数据模型,甚至从模拟器中删除了该应用程序,但似乎没有任何解决办法。 这是我所拥有的:

保存到CoreData的方法:

-(IBAction)save:(id)sender {
    NSManagedObject * newNews = [NSEntityDescription insertNewObjectForEntityForName:@"NewsStand"
    inManagedObjectContext:coredata.managedObjectContext];
    [newNews setValue:news_title forKey:@"story_title"];
    [newNews setValue:news_desc forKey:@"story_desc"];
    [newNews setValue:news_image  forKey:@"story_image"];
    [newNews setValue:test  forKey:@"story_url"];
    [coredata commit];
    NSLog(@"data saved!!!!");
}

我已经在一个单独的类中实现了核心数据的所有方法:

applicationDocumentsDirectory,  
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator, 
- (NSManagedObjectModel *)managedObjectModel, 
- (NSManagedObjectContext *)managedObjectContext

【问题讨论】:

    标签: objective-c xcode core-data


    【解决方案1】:

    确保coredata.managedObjectContext 不为零。

    【讨论】:

      【解决方案2】:

      这是一个相当常见的错误,它有三个原因:

      1. 实体名称拼写错误,例如NewsStand 而不是 NewsStands
      2. 拥有 nil 托管对象上下文
      3. 未加载或加载错误的托管对象模型。

      (1) 是最常见的,但 (3) 比 (2) 更常见。您可以检查您是否使用 keypath 加载了正确的模型:

      aManagedObjectContext.persistentStoreCoordinator.managedObjectModel.entities
      

      然后检查实体的名称。

      【讨论】:

      • 嗨!我尝试了您提到的“aManagedObjectContext.persistentStoreCoordinator.managedObjectModel.entities”,但结果为空!但是在重新检查我的代码后,我确定我写的实体名称是正确的,知道我怎样才能得到这个低谷吗?或者如何保证 objectContext 不是 nil
      • 嘿@TechZen,谢谢我已经修好了。添加了一个方法来检查核心数据代码所在的类的实例是否为 nil。
      • 发生在我身上的 (3) 的一个变体是我的数据模型的错误版本被标记为“当前”,因此应用程序正在查看的实体在该版本中不存在。
      • 啊……这让我明白了。我的 URLByAppendingPathComponent 中有错字。重命名模型时尚未更新。谢谢。希望这对其他人也有帮助。我看到了完全相同的行为。查看 NSManagedObjectModel ,它拥有我想要的一切,但从上下文中它们总是为零。
      【解决方案3】:

      我遇到了类似的问题,发现 TechZen 的回答很有帮助(尤其是检查实体的建议)。但是,我的问题原来是 (2) 的变体:我可以看到 moc 本身不是 nil,但我没有设置持久存储协调器。

      [aManagedObjectContext setPersistentStoreCoordinator:persistentStoreCoordinator]
      

      或类似的。

      我会将此作为评论添加到 TechZen 的答案中,但目前还不能,并且希望将其包含在内,以防其他人遇到我的问题。

      【讨论】:

        【解决方案4】:

        在我的开发过程中,我找不到后来添加的实体。 什么对我有用:

        每次更改数据模型时都卸载应用程序!

        数据模型在安装之间由 Core Data 缓存,以确保完整性保持不变。从模拟器/iPhone 中删除应用程序,以便能够测试您的更改。

        PS:有人知道如何自动执行此操作吗?

        【讨论】:

        • 一款已经发布到商店的应用呢?最终用户不必重新安装即可获得最新的数据模型,对吗?
        • @NgoanNguyen 好点。迁移是不可避免的。 raywenderlich.com/27657/…
        • 我更喜欢完全重置模拟器。制作了一个自定义快捷键 - Cmd+Shift+K 与我们使用此答案在 Xcode 中清理项目相同:stackoverflow.com/a/8352242/2082569
        【解决方案5】:

        没有代表发表评论 - 但 Luc Bloom 的回复解决了我的问题。我完全忘记了在初始构建/安装后更改了数据模型中的一些内容,并且花了很长时间将头撞在桌子上。

        【讨论】:

          【解决方案6】:

          如果您正在编辑框架并运行单元测试以获取错误,请确保将您的 xcdatamodeld 文件添加到测试目标中。框架的行为与普通项目不同。

          【讨论】:

            猜你喜欢
            • 2012-07-20
            • 1970-01-01
            • 2011-05-14
            • 1970-01-01
            • 2010-12-31
            • 2012-04-30
            • 2012-06-20
            • 2012-01-15
            • 2011-03-21
            相关资源
            最近更新 更多