核心数据 fetchRequest 给出 executeFetchRequest:error: <null> is not a valid NSFetchRequest

Posted

技术标签:

【中文标题】核心数据 fetchRequest 给出 executeFetchRequest:error: <null> is not a valid NSFetchRequest【英文标题】:Core data fetchRequest gives executeFetchRequest:error: <null> is not a valid NSFetchRequest 【发布时间】:2017-01-31 16:59:19 【问题描述】:

我不久前,我将我的一个应用程序更新到 ios 10,并且我得到了它的工作,从那时起我一直在我的手机上使用它(安装时没有删除旧应用程序,新应用程序替换了旧应用程序)。现在,当我从 iPhone 上删除了该应用程序并重新安装了同一个应用程序时,它就不起作用了。

我一直在尝试通过不同的更改来解决这个问题,并试图了解出了什么问题。我还在 Google 和 Stack Overflow 上进行了搜索,但均未成功。

我得到的错误是这样的:

由于未捕获的异常“NSInvalidArgumentException”而终止应用,原因:“executeFetchRequest:error: is not a valid NSFetchRequest.”

这是我的代码,它是在应用启动的早期执行的:

        let allItemFetchRequest: NSFetchRequest<Item>
    if #available(iOS 10.0, *) 
        allItemFetchRequest = Item.fetchRequest() as! NSFetchRequest<Item>
     else 
        // Fallback on earlier versions
        allItemFetchRequest = NSFetchRequest(entityName:"Item")
    

    do 
        let searchItems = try self.managedObjectContext.fetch(allItemFetchRequest)

        if searchItems.count == 0 
            return true
        
     catch let error as NSError 
        print("\(#file):\(#function): \(error)::\(error.userInfo)")
     catch 
        print("\(String(describing: self)):\(#function): fatal error")
        // Remove before release
        fatalError()
    

而且它总是在let searchItems = try self.persistentContainer.viewContext.fetch(allItemFetchRequest) 行崩溃。

该代码用于检查自上次启动以来是否有任何数据,如果没有,我将一些数据从文件添加到 Core Data SQLite DB。所以,以前如果工作,因为我认为数据库中有来自 iOS 10 之前版本的应用程序的数据。

如果我绕过此功能并使用let newItem = (NSEntityDescription.insertNewObject(forEntityName: "Item", into: self.managedObjectContext) as! Item) 将数据导入数据库,它会正确导入我的所有数据。对我来说,感觉这是我执行的第一个失败的获取请求 - 插入似乎工作正常。

我正在 AppDelegate 中使用 Apple 原始核心数据堆栈函数的迁移版本。

我做错了什么?任何帮助或提示将不胜感激!

【问题讨论】:

【参考方案1】:

编辑

当我简化 fetchRequest 的声明时,它就可以工作了。而不是使用:

let allItemFetchRequest: NSFetchRequest<Item>
if #available(iOS 10.0, *) 
    allItemFetchRequest = Item.fetchRequest() as! NSFetchRequest<Item>
 else 
    // Fallback on earlier versions
    allItemFetchRequest = NSFetchRequest(entityName:"Item")

尝试使用:

let entityName = String(describing: Item.self)
let request = NSFetchRequest<Item>(entityName: entityName)

干杯!

【讨论】:

我确实按照你的建议做了,而且我得到了它的工作。还是谢谢你! 这对我有用。我有一个内存存储,我的单元测试找不到正确的实体,因为 .entiy 查看所有上下文 ***.com/questions/51851485/…【参考方案2】:

在我的情况下,其他开发人员为实体选择了“当前对象模型”并致力于 SVN

如果选择当前产品模块,那么在 FileName+CoreDataClass.swift 中以下行不需要

@objc(EmployeeDirectory)

来自

import Foundation   
import CoreData

@objc(EmployeeDirectory)    
public class EmployeeDirectory: NSManagedObject 


import Foundation   
import CoreData

public class EmployeeDirectory: NSManagedObject 


快乐编码:)

【讨论】:

【参考方案3】:

就我而言,我不得不再次在核心数据中建立关系,再次创建 NSManagedObject 子类,然后错误消失。

【讨论】:

以上是关于核心数据 fetchRequest 给出 executeFetchRequest:error: <null> is not a valid NSFetchRequest的主要内容,如果未能解决你的问题,请参考以下文章

NSArray 作为核心数据 fetchRequest 中的参数

可可 iphone 核心数据谓词一对多 fetchrequest

确保核心数据@FetchRequest 变量动态运行需要哪些代码更改(附加代码)?

iOS:在 fetchrequest 中仅获取核心数据中的简单信息

在@FetchRequest 中输入一个动态值,以从 SwiftUI 中的核心数据中获取单个实体

核心数据:如何显示 fetchrequest 的结果以计算表格视图单元格中的值