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】:如果您将 MagicalRecored
与 Swift
一起使用:
确保在 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我建立了干净,但这并没有解决它。然后我删除了应用程序,但并没有解决它。然后我在同一时间构建了干净并删除了该应用程序,并修复了它。
【讨论】:
【参考方案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:错误: