【问题标题】:NSEntityDescription entityForName returning nilNSEntityDescription entityForName 返回 nil
【发布时间】:2010-06-12 23:17:39
【问题描述】:

我对我的模型做了一些更改(但我还不想迁移,所以我只是删除应用程序,构建干净等)

但是,当我在 iPhone 或模拟器中运行它时,我收到以下错误:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“executeFetchRequest:error: A fetch request must have an entity.”

我这样设置实体:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext];

我的 managedObjectContext 不是零。但我怀疑它没有正确加载对象模型或类似的东西,因为如果我在模型中显示实体,则列表为空:

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
NSLog(@"%d", [[managedObjectModel entities] count]);

如何确保模型已加载?

【问题讨论】:

    标签: ios core-data nsmanagedobject


    【解决方案1】:

    您在哪里“显示实体”?如果它们没有出现在数据模型编辑器中,它们就不存在。

    您可以使用-[NSManagedObjectModel entities] 获取模型拥有的实体数组。

    反过来,您可以使用-[NSPersistentStore managedObjectModel] 查看加载的模型,然后查询其实体。

    但是,必须告诉您,大多数情况下,此错误是由拼写错误引起的。这就是使用定义或类方法返回实体名称的好处。

    【讨论】:

    • 实体肯定会出现在实体编辑器中。我通过打印 [NSManagedObjectModel 实体] 的计数来显示实体。它是空的。对于错字,我会仔细检查,但我没有更改代码中的任何内容。我刚刚在我的模型中添加了一些字段。
    • 对空模型最简单的解释是更改后的模型由于某种原因没有被编译到应用程序中。正在使用空白或 nil 模型初始化商店协调器。
    • 那么,那该怎么办呢?我遇到了完全相同的问题。除了该应用程序在我的计算机上运行良好,但在我朋友的计算机上无法运行。我们使用相同的代码,
    • 谢谢!,刚刚发现moc不包含模型,发现它在属于不同xcdatamodel的不同CoreData堆栈下。
    【解决方案2】:

    我遇到了同样的问题。正如 TechZen 的评论中所建议的,对我来说,解决方法是右键单击 Xcode 3.x 中的文件,选择“获取信息”,然后在“目标”选项卡下勾选相应的框。

    更新: 在 Xcode 4 中,“获取信息”菜单选项已被删除。相反,您可以在右侧边栏中为文件定义“目标成员”。

    【讨论】:

    • 我有一个相当新鲜的项目,它是使用基于 Window 的应用程序创建的,具有核心数据和通用(iphone 和 ipad)。并且 xcdatamodel 文件未包含在默认目标中。选中该框以包含它为我解决了这个问题。
    • Jim:是的,Xcode 4 改变了一点——我已经更新了答案。
    【解决方案3】:

    另外需要注意的是,当您单击 xcdatamodeld 文件查看实体时,在左侧的 CONFIGURATIONS 默认配置下,您会看到实体列表。如果它们是您项目中的类(我认为它们应该是),请确保将类名放在 Class 列下。

    【讨论】:

      【解决方案4】:

      遇到了同样的问题。在我的情况下,旧模型仍在加载,所以我必须清理项目并从模拟器中卸载应用程序。

      调试:

      • 为了打印出对象模型中的所有实体,使用了这个: NSDictionary* 字典 = [self.managedObjectContext.persistentStoreCoordinator.managedObjectModel entityByName]; [字典 enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id key, id obj, BOOL *stop) { NSLog(@"%@ = %@", key, obj); }];
      • 还使用它来打印出实体的数量: NSLog(@"实体数量:%d", [[self.managedObjectContext.persistentStoreCoordinator.managedObjectModel 实体] count]);

      【讨论】:

        【解决方案5】:

        就我而言:

        1. 我的Model.xcdatamodeld 首先在应用程序(名称 A)中,然后它工作正常
        2. 我将修改应用添加到静态库中
        3. 将第 2 步静态库添加到新应用(名称 B)

        我在使用 app B 时遇到了和 Kamchatka 一样的问题

        您可以尝试将Model.xcdatamodeld 移动到主项目中尝试,这对我有用。

        【讨论】:

          【解决方案6】:

          我遇到了这个问题并且有一个非常奇怪的解决方法。我已经复制/粘贴了来自不同项目的一些代码,用于实际创建实体(然后更改了实体和上下文的值):

          NSEntityDescription *e = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:testContext];
          

          .. 无论我检查什么,尽管实体肯定存在于上下文中,但它返回 nil。

          我所做的只是删除该行,更改变量名,然后手动重新输入:

          NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:testContext];
          

          我希望我能告诉你为什么会修复它 - 我仍然不确定。我之前尝试过发布到此页面的所有解决方案。我怀疑这与“打开多个项目”有关 - 因此,如果您和我处于相同的情况,请尝试手动重写数据模型加载/获取过程。

          【讨论】:

            【解决方案7】:

            我在使用 Xcode 4.4 同时打开多个项目时遇到了这个问题。

            如果您有多个项目,Xcode 4.4 可能会使用来自错误项目的数据模型而找不到您的实体。解决方案是一次只打开一个项目。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-18
              相关资源
              最近更新 更多