由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“ executeFetchRequest:错误:<null>不是有效的NSFetchRequest。”

我遇到这样的错误

由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“ executeFetchRequest:错误:不是有效的NSFetchRequest。”以NSException类型的未捕获异常终止

我有一些案例,当我使用函数 func create(...) 然后调用 func read() 用于获取我刚才保存的内容,我也不会出错,该代码也能正常工作,但是当我仅调用函数 func read() 时,我就是出现错误:

由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“ executeFetchRequest:错误:不是有效的NSFetchRequest。”以NSException类型的未捕获异常终止

我的直觉是当对象对我的实体(上载ManagaerEntity)进行数据处理时出现的错误

这是我的课程 CoreDataContext.swift

import Foundation
import CoreData

public protocol CoreDataContextProtocol {
    associatedtype ObjectType
    associatedtype PredicateType
    var xcDataModelName: String { get }

    func save(_ object: ObjectType,completion: @escaping (Result<String,Error>) -> Void)
    func read(_ objectType: ObjectType.Type,predicate: PredicateType?,limit: Int?) -> Result<[ObjectType],Error>
    func delete(_ object: ObjectType,Error>) -> Void)
    func truncate(_ object: ObjectType.Type,Error>) -> Void)
}

public extension CoreDataContextProtocol {
    func read(_ objectType: ObjectType.Type,predicate: PredicateType? = nil,limit: Int? = nil) -> Result<[ObjectType],Error> {
        return read(objectType,predicate: predicate,limit: limit)
    }
}

class CoreDataContext: CoreDataContextProtocol {
    typealias ObjectType = NSManagedObject
    typealias PredicateType = NSPredicate
    var xcDataModelName: String { get { return "DataKoda" } }
    
    static let shared = CoreDataContext()
    var context: NSmanagedobjectcontext { persistentContainer.viewContext }
    private init() { }
    
    // MARK: -  DBHelper Protocol
    func save(_ object: NSManagedObject,Error>) -> Void) {
        do {
            try context.save()
            completion(.success("Success saving data \(object.description)"))
        } catch let err {
            completion(.failure(err))
        }
    }
    
    func read<T: NSManagedObject>(_ objectType: T.Type,predicate: NSPredicate? = nil,limit: Int? = nil) -> Result<[T],Error> {
        let request = objectType.fetchRequest()
        request.returnsObjectsAsFaults = false
        if let predicate = predicate {
            request.predicate = predicate
        }
        if let limit = limit {
            request.fetchLimit = limit
        }
        do {
            let result = try context.fetch(request)
            return .success(result as? [T] ?? [])
        } catch {
            return .failure(error)
        }
    }
    
    func delete(_ object: NSManagedObject,Error>) -> Void) {
        context.delete(object)
        save(object) { (result) in
            completion(result)
        }
    }
    
    func truncate<T: NSManagedObject>(_ object: T.Type,Error>) -> Void) {
        let request = NSBatchDeleteRequest(fetchRequest: object.fetchRequest())
        do {
            try context.execute(request)
            completion(.success("Success delete data \(object)"))
        } catch {
            completion(.failure(error))
        }
    }
    
    // MARK: - Core Data
    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: xcDataModelName)
        container.loadPersistentStores(completionHandler: { (storeDescription,error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error),\(error.userInfo)")
            }
        })
        return container
    }()

    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror),\(nserror.userInfo)")
            }
        }
    }
}

这是我的最后一堂课 DataManager.swift

protocol DataManagerProtocol {
    associatedtype EntityFinal: NSManagedObject
    var coreDataContext: CoreDataContext { get }
    var entityName: String { get }
    
    func getEntityDesc(context: NSmanagedobjectcontext) -> NSEntityDescription?
    func create(params: [String: Any])
    func read(predicate: NSPredicate?,limit: Int?) -> [EntityFinal]
    func update(params: [String: Any],_ object: EntityFinal)
    func truncate()
}

extension DataManagerProtocol {
    var coreDataContext: CoreDataContext { get { return CoreDataContext.shared } }
    var entityName: String { get { return String(describing: EntityFinal.self) } }
    
    func getEntityDesc(context: NSmanagedobjectcontext) -> NSEntityDescription? {
        let entity = NSEntityDescription.entity(forEntityName: self.entityName,in: context)
        return entity
    }
    
    func create(params: [String: Any]) {
        let entity = getEntityDesc(context: coreDataContext.context)
        let new = EntityFinal(entity: entity!,insertInto: coreDataContext.context)
        let keys = new.entity.attributesByName.keys
        for key in keys {
            debugLog(key)
            new.setvalue(params[key],forKey: key)
        }
        coreDataContext.save(new) { (result) in
            switch result {
            case .failure(let err):
                debugLog(err.localizedDescription)
            case .success(let res):
                debugLog(res)
            }
        }
    }
    
    func read(predicate: NSPredicate? = nil,limit: Int? = nil) -> [UploadManagerEntity] {
        let result: Result<[UploadManagerEntity],Error> = coreDataContext.read(UploadManagerEntity.self,limit: limit)
        switch result {
        case .failure(let err):
            debugLog(err.localizedDescription)
            return []
        case .success(let res):
            debugLog(res)
            return res
        }
    }
    
    func delete(_ object: EntityFinal) {
        coreDataContext.delete(object) { (result) in
            switch result {
            case .failure(let err):
                debugLog(err.localizedDescription)
            case .success(let res):
                debugLog(res)
            }
        }
    }
    
    func truncate() {
        coreDataContext.truncate(EntityFinal.self) { (result) in
            switch result {
            case .failure(let err):
                debugLog(err.localizedDescription)
            case .success(let res):
                debugLog(res)
            }
        }
    }
}

// MARK: - DataManagerProtocol
final class DataManager: DataManagerProtocol {
    typealias EntityFinal = UploadManagerEntity
    
    static let shared: DataManager = DataManager()
    private init() { }
    
    func update(params: [String : Any],_ object: UploadManagerEntity) {
        let predicate = NSPredicate(
            format: "submission_id = %@",(object.submission_id ?? "") as CVarArg
        )
        guard let result = read(predicate: predicate,limit: 1).first else { return }
        let keys = result.entity.attributesByName.keys
        for key in keys {
            debugLog("update",key)
            result.setvalue(params[key],forKey: key)
        }
        coreDataContext.save(result) { (result) in
            switch result {
            case .failure(let err):
                debugLog(err.localizedDescription)
            case .success(let res):
                debugLog(res)
            }
        }
    }
}

我对bcs感到困惑,认为有人提出建议或建议,如何解决?

zhenguofen 回答:由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“ executeFetchRequest:错误:<null>不是有效的NSFetchRequest。”

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1328022.html

大家都在问