【问题标题】:NSInvalidArgumentException in App Delegate on launch with CoreData app使用 CoreData 应用程序启动时 App Delegate 中的 NSInvalidArgumentException
【发布时间】:2013-05-03 21:01:07
【问题描述】:

我有这个应用程序,我已经使用 CoreData 创建了一段时间。但是,我最近开始构建数据模型并使用 CoreData。现在我已经这样做了,每当我在模拟器中运行应用程序时,它都会在第一行的 App Delegate / didFinishLaunchingWithOptions 中崩溃:

self.window.rootViewController = self.navigationController;

崩溃是:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'executeFetchRequest:error: A fetch request must have an entity.'

如果我注释掉那行,它就会运行。奇怪的!目前我还没有在代码中对 CoreData 做任何工作——所以还没有获取。也许有一些系统获取,因为数据模型改变了?我已从模拟器中删除了该应用并进行了清理/构建,但问题仍然存在。

第一个问题:如何修复错误?

第二个问题:这是一个问题,我可以忽略设置rootViewController吗?

第三个问题:为什么现在失败了?

【问题讨论】:

  • 某处您正在执行获取请求并且您的 NSManagedObjectContext 可能为空。你在任何地方都使用 NSFetchedResultsController 吗?
  • 这很有趣,@MarkM,我还没有想到。我敢打赌,在分配 rootViewController 属性期间发生的一些自动获取中,是一些尚未合并的数据模型更新。我正在学习 CoreData 教程,所以我还不知道如何在应用程序中管理数据模型更新。
  • 执行“在工作区中查找”以获取并在每个实例处放置断点。您会发现提取发生的位置。
  • 好主意,可惜没有成功。有一个 RootViewController 类在 fetchedResultsController 方法中进行一些获取,但在那之后发生了崩溃。
  • fetchedResultsController 与什么实体对话?你肯定有一个 fetch 发生,因为 NSFetchedResultsController 也有一个方法可以在发生更改时更新,你可能想在那里检查。它是用于 tableViewController 的吗?

标签: ios core-data executefetchrequest


【解决方案1】:

根据您使用的项目模板,Xcode 可能会为您设置默认获取请求。在编辑模型时,您需要自定义这些。

例如,“Master-Detail Application”模板在 MasterViewController.m 中创建了一个NSFetchedResultsController。它使用一个 fetch 请求来查找默认的 Event 实体类型。如果该实体不存在,则提取请求将因您看到的错误而崩溃。我猜您删除了默认实体,创建了一些您自己的实体,但没有更改发出 fetch 请求的代码。

注释掉该行可以防止崩溃,但也会阻止应用程序运行。你只是跳过了一些关键的工作,但你需要把那行放回去并修复代码。

【讨论】:

  • 是的,这就是我害怕的。我在旧版本的 XCode 4 中创建了该应用程序,我很确定它使用的是单视图应用程序模板。我不记得看过主从模板。
  • 没什么好怕的,真的。确保 Xcode 为您生成的任何代码都与您的数据模型匹配。可能有不匹配的地方,而且可能不难找到。
【解决方案2】:

在我的特殊情况下,模板必须在数据模型中设置了一个默认的事件实体,并设置了一个默认的获取控制器来管理批量获取结果,这在我的应用程序中根本不需要。当我删除 Event 实体时,因为它与应用程序无关,这导致它在实例化生成的 View Controller 时崩溃。所以我把 fetch 控制器代码注释掉了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2011-08-03
    相关资源
    最近更新 更多