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

时间:2010-11-12 04:21:25

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

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

这是错误:

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

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

提前致谢!

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

19 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:16)

如果您将 MagicalRecored Swift 一起使用

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

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

答案 2 :(得分:15)

在搜索了所有解决方案之后,为我修复的是在Xcode中进行清理/构建。

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

答案 3 :(得分:12)

我有同样的错误。

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

希望有所帮助。

答案 4 :(得分:11)

好像我的数据被破坏了,所以我在iPhone模拟器中删除了我的数据模型和数据库,并开始新鲜。

答案 5 :(得分:7)

另外,请确保您的.xcdatamodeld文件位于Build Phases的“Copy Bundle Resources”阶段。

答案 6 :(得分:6)

检查是否,

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

答案 7 :(得分:4)

以下是为我解决的问题:

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

这实际上是我的错误。

Swift 2.2:

let request = NSFetchRequest(entityName: "MyEntity")

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

let request = NSFetchRequest<MyEntity>()

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

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

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

答案 8 :(得分:2)

如果您使用的是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")

答案 9 :(得分:1)

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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

我在第一步进入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")
}

答案 13 :(得分:0)

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

我遇到了这个问题,并通过从相关框架的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")

瞧!

答案 14 :(得分:0)

您也可以使用CoraData中的setter方法......只需做这样的事情......

在CustomCoreDataManager.m

import&#34; ObjectiveRecord.h&#34; 像这样调用init方法

(instancetype)init {

self = [super init];

if(self){

[[CoreDataManager sharedManager] setModelName:@&#34; YourModelName&#34;]; }

回归自我; }

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

答案 15 :(得分:0)

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

无论何时修改核心数据(如添加实体),您都必须删除所有现有数据(如果尚未发布应用),或者在模型中添加新版本。

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

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