繁体   English   中英

核心数据 fetchRequest 给出了 executeFetchRequest:error:<null> 不是有效的 NSFetchRequest

[英]Core data fetchRequest gives executeFetchRequest:error: <null> is not a valid NSFetchRequest

不久前,我将我的一个应用程序更新到了 iOS 10,并且可以正常工作,从那时起我就一直在手机上使用它(安装时没有删除旧应用程序,新应用程序取代了旧应用程序)。 现在,当我从 iPhone 中删除该应用程序并重新安装相同的应用程序时,它不起作用。

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

我得到的错误是这样的:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“executeFetchRequest:error: 不是有效的 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 原始 Core 数据堆栈函数的迁移版本。

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

编辑

当我简化 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)

干杯!

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

在此处输入图片说明

如果选择 Current Product Module,则在 FileName+CoreDataClass.swift 中不需要以下行

@objc(EmployeeDirectory)

import Foundation   
import CoreData

@objc(EmployeeDirectory)    
public class EmployeeDirectory: NSManagedObject {

}

import Foundation   
import CoreData

public class EmployeeDirectory: NSManagedObject {

}

快乐编码:)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM