无法找到实体名称的NSManagedObjectModel

时间:2010-07-27 21:50:29

标签: iphone cocoa-touch core-data

这是toggleAddProject方法的代码,核心数据代码与Apple的CoreDataBooks示例中的代码几乎相同,但是当我单击添加按钮时,应用程序在{{1}开头的行上与entityForName: could not locate an NSManagedObjectModel for entity name 'Project'崩溃}}

newProjectController.project

一切都已合成,项目实体存在。我无法弄清楚它崩溃的原因。大多数人似乎能够通过在方法本身或viewDidLoad中插入以下代码来修复此错误:

-(IBAction)toggleAddProject 
{
    NewProjectViewController *newProjectController = [[[NewProjectViewController alloc] initWithStyle:UITableViewStyleGrouped] autorelease];

    // Create a new managed object context for the new project -- set its persistent store coordinator to the same as that from the fetched results controller's context.
    NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init];
    self.addingManagedObjectContext = addingContext;
    [addingManagedObjectContext setPersistentStoreCoordinator:[[fetchedResultsController managedObjectContext] persistentStoreCoordinator]];
    newProjectController.project = (Project *)[NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:addingContext];
    [addingContext release];


    UINavigationController *addNewNavigationController = [[UINavigationController alloc] initWithRootViewController:newProjectController];
    [self.navigationController presentModalViewController:addNewNavigationController animated:YES];  
    [addNewNavigationController release];
}

为我的应用委托修改后,它没有任何区别。谢谢你的帮助。

7 个答案:

答案 0 :(得分:40)

此错误只有几个可能的来源:

  1. 实体名称中的错字。
  2. Nil托管对象上下文对象。
  3. 未能将包含实体的模型添加到上下文使用的持久性存储中。
  4. 未能将正确的持久存储添加到上下文本身。

答案 1 :(得分:23)

当我有几个不同的NSManagedObjectContext时,我遇到了这个问题。调试它的快速方法是检查不同的连接位,并确保在调用上下文之前列出了我的实体。

NSLog(@"Context: %@",context);
NSLog(@"PS Coord : %@",context.persistentStoreCoordinator);
NSLog(@"MOM : %@", context.persistentStoreCoordinator.managedObjectModel);
NSLog(@"Entities : %@",[[context.persistentStoreCoordinator.managedObjectModel entities] valueForKey:@"name"]); 

答案 2 :(得分:3)

使用调试器并确认您的模型不是零。这是此错误的最常见原因。如果它不是nil,那么在实体名称中查找拼写错误。

答案 3 :(得分:2)

Apple文档提供了有关调试错误entityForName: could not locate an NSManagedObjectModel for entity name 'Foo'的一些很好的信息。

查看核心数据编程指南的this部分。

答案 4 :(得分:1)

好的我也遇到了这个问题,因此我解决了这个问题。原始代码如下:

Event *event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:managedObjectContext];

虽然代码简洁,但似乎调试器无法显示有关错误位置的更详细信息,因为您要创建和配置“事件”实体的新实例(或者您的实体的任何名称)。

相反,我将其分为三行,调试器显示了更多信息:

Event *event = [[NSManagedObject alloc] init];
NSManagedObjectContext *moc = [self managedObjectContext];
event = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:moc];

我发现我没有为其中一个属性设置正确的Type,而且我的代码中有一个拼写错误,所有这些都是调试器指出的。

答案 5 :(得分:0)

在我的开发过程中,我找不到我后来添加的实体。 什么对我有用:(基本上是一个理智小费)

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

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

PS:有没有人知道如何自动完成?

答案 6 :(得分:-1)

TechZen在......我的情况是#4。完成以下链接中的步骤,这应该可以帮助您将适当的CoreData方法添加到现有项目中并正确设置所有内容,这样您就不会遇到错误。

Adding Core Data To Existing iPhone Projects