NSEntityDescription entityForName返回nil

时间:2010-06-12 23:17:40

标签: ios core-data nsmanagedobject

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

然而,当我在iPhone或模拟器上运行它时,我收到以下错误:

  

***因未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'executeFetchRequest:error:获取请求必须有实体。'

我像这样设置实体:

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

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

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

如何确保加载模型?

7 个答案:

答案 0 :(得分:6)

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

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

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

但是要告诉你,大多数时候这个错误是由拼写错误造成的。这就是为什么使用定义或类方法返回实体名称的好处。

答案 1 :(得分:6)

我遇到了同样的问题。正如TechZen的评论中所建议的那样,我的修复是右键单击Xco​​de 3.x中的文件,选择“获取信息”,然后勾选“目标”选项卡下的相应框。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我遇到过这个问题,Xcode 4.4同时打开了多个项目。

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

答案 4 :(得分:0)

有同样的问题。在我的情况下,旧模型仍在加载,所以我不得不清理项目,并从模拟器卸载应用程序。

调试:

  • 为了打印出对象模型中使用的所有实体: NSDictionary * dictionary = [self.managedObjectContext.persistentStoreCoordinator.managedObjectModel entitiesByName]; [dictionary enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id key,id obj,BOOL * stop){     NSLog(@“%@ =%@”,key,obj); }];
  • 也用它打印出实体数量: NSLog(@“实体数量:%d”,[[self.managedObjectContext.persistentStoreCoordinator.managedObjectModel entities] count]);

答案 5 :(得分:0)

就我而言:

  1. 我的Model.xcdatamodeld是应用中的第一个(名称A),然后就可以了。
  2. 我将应用程序修改为静态库
  3. 将第2步静态库添加到新应用程序(名称B)
  4. 使用应用程序B时,我遇到与堪察加相同的问题

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

答案 6 :(得分:0)

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

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

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

我所做的就是删除该行,更改变量名称,&手动重新输入:

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

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