我对我的模型进行了一些更改(但我还不想迁移,所以我只是删除应用程序,构建干净等等。)
然而,当我在iPhone或模拟器上运行它时,我收到以下错误:
***因未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'executeFetchRequest:error:获取请求必须有实体。'
我像这样设置实体:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext];
我的managedObjectContext不是nil。但我怀疑它没有正确加载对象模型或类似的东西,因为如果我在模型中显示实体,列表是空的:
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
NSLog(@"%d", [[managedObjectModel entities] count]);
如何确保加载模型?
答案 0 :(得分:6)
你在哪里“展示实体”?如果它们没有出现在数据模型编辑器中,则它们不存在。
您可以使用-[NSManagedObjectModel entities]
来获取模型所具有的实体数组。
反过来,您可以使用-[NSPersistentStore managedObjectModel]
查看加载的模型,然后查询其实体。
但是要告诉你,大多数时候这个错误是由拼写错误造成的。这就是为什么使用定义或类方法返回实体名称的好处。
答案 1 :(得分:6)
我遇到了同样的问题。正如TechZen的评论中所建议的那样,我的修复是右键单击Xcode 3.x中的文件,选择“获取信息”,然后勾选“目标”选项卡下的相应框。
更新: 在Xcode 4中,“获取信息”菜单选项已被删除。相反,您可以为右侧边栏中的文件定义“目标成员资格”。
答案 2 :(得分:1)
需要注意的另一点是,当您单击xcdatamodeld文件以查看实体时,在左侧的CONFIGURATIONS下,默认配置,您会看到实体列表。如果它们是您项目中的类(我认为它们应该是),请确保将类名放在Class列下。
答案 3 :(得分:0)
我遇到过这个问题,Xcode 4.4同时打开了多个项目。
如果您有多个项目,Xcode 4.4可能会使用错误项目中的数据模型而找不到您的实体。解决方案是一次只打开一个项目。
答案 4 :(得分:0)
有同样的问题。在我的情况下,旧模型仍在加载,所以我不得不清理项目,并从模拟器卸载应用程序。
调试:
答案 5 :(得分:0)
就我而言:
Model.xcdatamodeld
是应用中的第一个(名称A),然后就可以了。使用应用程序B时,我遇到与堪察加相同的问题
您可以尝试将Model.xcdatamodeld
移至主项目以尝试,这对我有用。
答案 6 :(得分:0)
我遇到过这个问题&有一个非常奇怪的修复。我已经复制/粘贴了来自不同项目的一些代码,用于实际创建实体(&然后更改了实体和上下文的值):
NSEntityDescription *e = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:testContext];
..无论我检查了什么,尽管实体肯定存在于上下文中,但仍返回nil。
我所做的就是删除该行,更改变量名称,&手动重新输入:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:testContext];
我希望我能告诉你为什么修复它 - 我仍然不确定。我之前尝试过发布到此页面的所有解决方案。我怀疑这有关于“打开多个项目”的事情 - 所以如果你和我的情况相同,请尝试手动重写数据模型加载/获取过程。