executeFetchRequest:error: 获取请求必须有一个实体

Posted

技术标签:

【中文标题】executeFetchRequest:error: 获取请求必须有一个实体【英文标题】:executeFetchRequest:error: A fetch request must have an entity 【发布时间】: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]; 的错字 【参考方案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

【讨论】:

以上是关于executeFetchRequest:error: 获取请求必须有一个实体的主要内容,如果未能解决你的问题,请参考以下文章

NSInvalidArgumentException',原因:'executeFetchRequest:错误:

iOS:executeFetchRequest:错误:获取请求必须有一个实体

带有扩展的 Swift 核心数据

使用方法预填充核心数据