【问题标题】:executeFetchRequest:error: A fetch request must have an entityexecuteFetchRequest:error: 获取请求必须有一个实体
【发布时间】:2011-05-08 21:01:16
【问题描述】:

我有一个运行良好的项目。它检查了“核心数据”,并设置了所有数据模型。我今晚才开始添加几个实体和属性。当我现在尝试运行我的应用程序时,它甚至不会加载。它只是在我身上崩溃。

这是错误:

'NSInvalidArgumentException', reason: 'executeFetchRequest:error: A fetch request must have an entity.'

我真的很害怕,因为我没有这个备份,如果我不能让它工作,我不知道我会做什么。 :)

提前致谢!

编辑: 我厌倦了我的数据,所以我刚刚将一个新的空白 xcdatamodel 复制到我的项目中,我将重新开始。谢谢您的帮助!

【问题讨论】:

  • 您需要发布代码的相关部分。
  • executeFetchRequest:error: 调用周围的代码将非常有助于理解您的问题。
  • 您可能从 coredata 中获取了错误的实体 .. 可能是 NSEntityDescription *entity = [NSEntityDescription entityForName:@"CHECK_HERE" inManagedObjectContext:managedObjectContext]; 的错字

标签: iphone objective-c xcode core-data crash


【解决方案1】:

我的问题是我没有为实体和类使用相同的名称。修复它的简单解决方案是给它们起相同的名称。

【讨论】:

  • 这是一个简单的解决方案吗?您可以简单地修改数据模型中的默认配置(映射:实体 -> 类)。
【解决方案2】:

如果您将 MagicalRecoredSwift 一起使用:

确保在 Swift NSManagedObject 子类中使用 @objc 指令,以使 MagicalRecord 库中的 Objective-C 代码可以访问该类

@objc(MyEntity)
class MyEntity: NSManagedObject {
    @NSManaged var myAttribute: Int16
}

【讨论】:

  • 谢谢!但是,只要您重新创建 NSManagedObject 子类,实体文件就会被覆盖。有没有比每次手动添加该行更好的方法?
  • 应用程序在 iOS 9.3 中崩溃,但在我添加 @objc(MyEntity) 时使用 iOS 10.3,建议它在 iOS 9.3 上工作,但在 iOS 10.3 上应用程序崩溃知道为什么会崩溃吗?
【解决方案3】:

在全面搜索解决方案后,为我解决的问题是在 Xcode 中进行清理/构建。

Product->Clean,Product->Build,然后尝试运行它。

【讨论】:

  • 我都删除了模拟器中的应用程序,并进行了清理/构建。同样的问题,所以这并没有解决我的问题。我不想删除并重新创建复杂的数据模型。那么,如何非破坏性地纠正这个问题呢?
  • 为什么投反对票,@JayImerman?很抱歉,我的回答对您不起作用,但这并不意味着您应该否决它。您是否在模拟器中尝试过“重置内容和设置”?它可以在真实设备上运行吗?
【解决方案4】:

好像我的数据损坏了,所以我删除了 iPhone 模拟器中的数据模型和数据库,然后重新开始。

【讨论】:

  • 是的,别忘了从模拟器中删除应用!
【解决方案5】:

我有同样的错误。

对我来说,这是因为我添加了一个新的模型版本,但我没有将它设置为“当前版本”。不小心我!要修复,请选择 xcdatamodel,单击设计 > 数据模型 > 设置当前版本。 xcdatamodel 文件将有一个绿色勾号。

希望有所帮助。

【讨论】:

    【解决方案6】:

    另外,请确保您的 .xcdatamodeld 文件处于构建阶段的“复制捆绑资源”阶段。

    【讨论】:

      【解决方案7】:

      这是为我解决的问题:

      当我转换到 Swift 3 时,Xcode 在声明一个新的 NSFetchRequest 时给了我一个错误,说它需要一个类型。添加类型后,我做了其他人会假设的事情;如果请求是键入的,为什么要指定实体名称?所以,我删除了它。

      其实是我的错。

      斯威夫特 2.2:

      let request = NSFetchRequest(entityName: "MyEntity")
      

      当我第一次转换到 Swift 3 时:

      let request = NSFetchRequest<MyEntity>()
      

      这给了我一个错误。我最终得到了这个:

      let request = NSFetchRequest<MyEntity>(entityName: "MyEntity")
      

      一切正常。就个人而言,如果您正在输入请求,我不确定为什么需要指定实体名称。也许他们会在某个时候更新(我希望)

      【讨论】:

        【解决方案8】:

        检查是否,

        • 实体存在于 xcdatamodel 文件中。
        • 使用的实体名称相同。

        【讨论】:

          【解决方案9】:

          我在苹果开发者论坛上找到了这个解决方案,这正是我的问题!

          解决方案是必须在 struct App 中定义上下文。 不在环境参数中

          import SwiftUI
          @main
          struct CoreDataDemoApp: App {
              
              private let context = CoreDataStack.context. 
              var body: some Scene {
                  WindowGroup {
                      ContentView()
                          .environment(\.managedObjectContext, context)
                  }
              }
          }
          

          【讨论】:

          • 上面写着 2020 年 8 月 15 日
          【解决方案10】:

          如果您使用的是 Swift 3 和 Core Data 的新堆栈语法:

          var persistentContainer: NSPersistentContainer = {
              let container = NSPersistentContainer(name: "MyAppModel")
              container.loadPersistentStores(completionHandler: {
                  (storeDescription, error) in
                  if let error = error as NSError? {
                      fatalError("Unresolved error \(error), \(error.userInfo)")
                  } else {
                      print(storeDescription)
                  }
              })
              return container
          }()
          

          那么你应该使用这个获取语法:

          let request: NSFetchRequest<Client> = Client.fetchRequest()
          

          在使用不同的变体时,我在应用启动后的第一次提取时遇到了这个错误:

          let request: NSFetchRequest<NSFetchRequestResult> = Client.fetchRequest()
          
          let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Client")
          

          【讨论】:

            【解决方案11】:

            在迈出 Core Data(以及 iOS 11 和 Swift 4)的第一步时,我确实偶然发现了同样的错误。我从一本书开始(第六版的目标是 Swift 4,但大概包括一些遗留的东西)。

            按照书中的建议,我的代码是:

            let fetchRequest = NSFetchRequest<ReminderData>()
            let entity = ReminderData.entity()
            fetchRequest.entity = entity
            do {
                let rows = try managedObjectContext.fetch(fetchRequest)
            } catch {
                fatalError("Unresolved error")
            }
            

            原来我从ReminderData.entity() 得到的只是nil。不确定我在设置数据模型时是否做错了,或者... Apple 的文档说不能覆盖 NSManagedObject.entity()

            长话短说,Codegen 文件ReminderData+CoreDataProperties.swift 确实包含解决方案:

            @nonobjc public class func fetchRequest() -> NSFetchRequest<ReminderData> {
                return NSFetchRequest<ReminderData>(entityName: "ReminderDB")
            }
            

            这就是我最终得到正确的NSFetchRequest 所必须使用的,不用摆弄NSEntityDescription,问题就解决了!

            let fetchRequest = NSFetchRequest<ReminderData>(entityName: "ReminderDB")
            do {
                let rows = try managedObjectContext.fetch(fetchRequest)
            } catch {
                fatalError("Unresolved error")
            }
            

            【讨论】:

            • 或者让 fetchRequest: NSFetchRequest = fetchRequest() 无需显式输入实体的名称(通过使用您在 Codegen 文件 ReminderData+CoreDataProperties.swift 中提到的函数)跨度>
            【解决方案12】:

            我建立了干净,但这并没有解决它。然后我删除了应用程序,但并没有解决它。然后我在同一时间构建了干净并删除了该应用程序,并修复了它。

            【讨论】:

              【解决方案13】:

              只需添加相同的问题。我复制了我所有的实体。删除数据模型,重新创建一个空模型并将实体粘贴回新数据模型。解决了我的问题。

              【讨论】:

                【解决方案14】:

                首先,我通过 Organizer 下载了应用程序的数据(以查看发生了什么),并注意到它让我可以将其保存在以前的项目名称下。这让我很困惑。所以我退出了 XCode 4.6.1,从我的 iPhone 中删除了应用程序(及其数据),然后又回来了。

                这一次我收到了一个错误消息Cannot create an NSPersistentStoreCoordinator with a nil model。所以我查看了 AppDelegate.m 文件并更改了 - (NSPersistentStoreCoordinator *) persistentStoreCoodinator 方法中的 URLForResource。它被设置为我的应用程序的名称,我将其更改为“模型”以匹配我的 Model.xcdatamodeld 的名称。
                它现在正在工作。

                【讨论】:

                  【解决方案15】:

                  当我从错误的数据库中获取数据时,这发生在我身上。我的应用程序有 3 个 sqlite 数据库,当然还有 3 个 ManagedObjectContext 实例。好吧,我将错误的 ManagedObjectContext 提交给一个方法,要求它查询我提交的 ManagedObjectContext 中不存在的表。使用正确的 ManagedObjectContext 后,一切都很好。

                  【讨论】:

                    【解决方案16】:

                    我认为最初的问题/问题,以及大多数这些答案解决的问题(只是以不同的方式)只是一个真正简单的问题:

                    每当您修改核心数据(例如添加您提到的实体)时,您要么必须删除所有现有数据(如果您尚未发布应用),要么向模型添加新版本。

                    只是想我会发布这个答案,即使这是一个较老的问题,因为这个答案似乎很明显,到目前为止我在上面阅读的任何问题或 cmets 中都没有讨论过。

                    【讨论】:

                      【解决方案17】:

                      您也可以使用 CoraData 中的 setter 方法...只需执行以下操作...

                      在您的 CustomCoreDataManager.m 上

                      导入“ObjectiveRecord.h” 像这样调用init方法

                      (实例类型)初始化 {

                      self = [超级初始化];

                      如果(自我){

                      [[CoreDataManager sharedManager] setModelName:@"YourModelName"]; }

                      返回自我; }

                      希望这对某人有所帮助...

                      【讨论】:

                        【解决方案18】:

                        也许您正试图从不同/错误的捆绑包中加载数据库? 例如来自或在框架内?

                        我遇到了这个问题,并通过从相关框架的bundle 加载数据库来解决它。然后一切正常!

                        Swift 4 + MagicalRecord:

                        let frameworkBundle = Bundle(for: AClassFromTheFramework.self)
                        let managedObjectModel = NSManagedObjectModel.mergedModel(from: [frameworkBundle])
                        MagicalRecord.setShouldAutoCreateManagedObjectModel(false)
                        NSManagedObjectModel.mr_setDefaultManagedObjectModel(managedObjectModel)
                        MagicalRecord.setupCoreDataStack(withAutoMigratingSqliteStoreNamed: "db.sqlite")
                        

                        瞧!

                        【讨论】:

                          【解决方案19】:

                          我遇到了同样的问题,实际上我调用的是MyEnty 而不是MyEntity,所以请重新检查您为实体指定的名称并调用相同的名称,并检查您是否调用了您定义的相同属性喜欢name

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 2020-12-03
                            • 1970-01-01
                            • 1970-01-01
                            • 2015-08-18
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多