【问题标题】:could not locate an NSManagedObjectModel for entity name找不到实体名称的 NSManagedObjectModel
【发布时间】:2011-03-21 20:55:06
【问题描述】:

这是 toggleAddProject 方法的代码,Core Data 代码与 Apple 的 CoreDataBooks 示例中的代码几乎相同,但是当我单击添加按钮时,应用程序崩溃,entityForName: could not locate an NSManagedObjectModel for entity name 'Project' 在以 newProjectController.project 开头的行

-(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];
}

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

if (managedObjectContext == nil) 
{ 
    managedObjectContext = [(CoreDataBooksAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
}

当为我的应用委托进行修改时,它没有任何区别。感谢您的帮助。

【问题讨论】:

    标签: iphone cocoa-touch core-data


    【解决方案1】:

    TechZen 名列前茅……在我的情况下,它是第 4 位。浏览以下链接中的步骤,这应该可以帮助您将适当的 CoreData 方法添加到现有项目中并正确设置所有内容,这样您就不会遇到您遇到的错误。

    Adding Core Data To Existing iPhone Projects

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 您应该使用轻量级迁移来解决此问题。这是一篇简短的博客文章对此进行了解释:blog.the-nerd.be/2012/02/… 这是一篇更详细的博客文章:raywenderlich.com/27657/…
      • "每次更新模型中的某些内容时,都需要创建一个新版本。"是的。。不。我宁愿每次都删除设备上的现有设备(在初始开发期间)。这样,我就不必考虑我刚刚所做的更改是否足够轻量级。这样,我就有了一个始终有效的工作流程。
      【解决方案4】:

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

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

      【讨论】:

      • 迄今为止解决问题的最佳解决方案。这只是帮助我发现我的 persistentStoreCoordinator 没有正确连接。
      • 宾果游戏!我还没有解决我的问题,但这肯定会引导我走上正确的道路。
      【解决方案5】:

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

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

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

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

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

      我发现我没有为其中一个属性设置正确的类型,并且我的代码中有错字,所有这些都是调试器指出的。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 我最终以不同的方式处理了这个问题,这个错误现在没有出现。但是无论如何,谢谢,我的代码中没有错别字,但我确定这是您列出的其他内容之一,很可能 moc 为 nil。
        • 4.是我的问题
        【解决方案7】:

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

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

        【讨论】:

        • 是的,我看过这个,但无法解决问题,因此我在这里发帖。
        • Welp,请为已经查看的文档点赞。 :)
        猜你喜欢
        • 2012-03-02
        • 1970-01-01
        • 2012-07-20
        • 2011-10-29
        • 2011-05-14
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        相关资源
        最近更新 更多