Swift 使用方法预填充核心数据

Swift 使用方法预填充核心数据,swift,core-data,Swift,Core Data,我为我的核心数据子类创建了一个扩展,在这里我实现了一个预填充表的方法,首先我检查表中是否有任何内容,然后插入一些值,但在执行提取时出现错误: 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“executeFetchRequest:错误:不是有效的NSFetchRequest”。 import Foundation import CoreData extension SimulationParams { public static fun

我为我的核心数据子类创建了一个扩展,在这里我实现了一个预填充表的方法,首先我检查表中是否有任何内容,然后插入一些值,但在执行提取时出现错误:

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

import Foundation
import CoreData

extension SimulationParams {

    public static func feedSimulationParams(context: NSManagedObjectContext) {


        let fetchRequest : NSFetchRequest<NSFetchRequestResult>

        if #available(iOS 10.0, *) {
            fetchRequest = SimulationParams.fetchRequest()
        } else {
            fetchRequest = NSFetchRequest(entityName: "SimulationParams")
        }

        let idDescriptor: NSSortDescriptor = NSSortDescriptor(key: "id", ascending: false)
        fetchRequest.sortDescriptors = [idDescriptor]

        fetchRequest.fetchLimit = 1


        var newId = 0;

        do {
            let results = try context.fetch(fetchRequest)

            if(results.count == 0){

                self.setValue(getId(fetchRequest: fetchRequest, context: context), forKeyPath: "id")
                self.setValue(1.5, forKeyPath: "bankFeePercentage")
                self.setValue(1, forKeyPath: "consoMaxMonthly")
                self.setValue(12, forKeyPath: "consoMinMonthly")
                self.setValue(3.5, forKeyPath: "consoRatePercentage")
                self.setValue(4, forKeyPath: "fileFeePercentage")
                self.setValue(1, forKeyPath: "immoMaxMonthly")
                self.setValue(25, forKeyPath: "immoMinMonthly")
                self.setValue(2.05, forKeyPath: "immoRatePercentage")
                self.setValue(3, forKeyPath: "prepaymentPenaltyPercentage")
                self.setValue(1, forKeyPath: "notaryGridId")

                do {
                    try context.save()
                } catch let error as NSError {
                    print ("Error first demande insertion \(error)")
                }
            }


        } catch {
            let fetchError = error as NSError
            print(fetchError)
        }



    }
}
<代码>导入基础 导入CoreData 扩展模拟参数{ 公共静态func feedSimulationParams(上下文:NSManagedObjectContext){ let fetchRequest:NSFetchRequest 如果可用(iOS 10.0,*){ fetchRequest=SimulationParams.fetchRequest() }否则{ fetchRequest=NSFetchRequest(entityName:“SimulationParams”) } 让idDescriptor:NSSortDescriptor=NSSortDescriptor(键:“id”,升序:false) fetchRequest.sortDescriptors=[idDescriptor] fetchRequest.fetchLimit=1 var-newId=0; 做{ let results=try context.fetch(fetchRequest) 如果(results.count==0){ setValue(getId(fetchRequest:fetchRequest,context:context),forKeyPath:“id”) self.setValue(1.5,forKeyPath:“bankFeePercentage”) self.setValue(1,forKeyPath:“conomaxmonthly”) self.setValue(12,forKeyPath:“consminmonthly”) self.setValue(3.5,forKeyPath:“联合百分比”) self.setValue(4,forKeyPath:“fileFeePercentage”) self.setValue(1,forKeyPath:“immoMaxMonthly”) self.setValue(25,forKeyPath:“每月固定”) self.setValue(2.05,forKeyPath:“固定百分比”) self.setValue(3,forKeyPath:“预付款罚款类型扣款”) self.setValue(1,forKeyPath:“notaryGridId”) 做{ 尝试context.save() }将let错误捕获为NSError{ 打印(“错误第一需求方插入\(错误)”) } } }抓住{ 让fetchError=错误为NSError 打印(获取错误) } } } 解决方案:

警告,您必须删除数据模型检查器中的模块,并将其设置为全局命名空间

您必须在代码上执行此操作:

    let fetchRequest : NSFetchRequest<NSFetchRequestResult>

    if #available(iOS 10.0, *) {
        fetchRequest = Params.fetchRequest()
    } else {
        fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Params")
    }

    //let predicate = NSPredicate(format: "key=%@", key)
    //fetchRequest.predicate = predicate

    do {
        let results = try context.fetch(fetchRequest)

        if(results.count != 0){

            let params = NSEntityDescription.insertNewObject(forEntityName: "Params", into: context) as! Params

            params.setValue(value, forKey: "value")

            do {
                try context.save()
            } catch let error as NSError {
                print ("Error first demande insertion \(error)")
            }

        } else if (results.count == 0) {

            let params = NSEntityDescription.insertNewObject(forEntityName: "Params", into: context) as! Params

            params.key = key
            params.value = value

            context.insert(params)
        }


    } catch {
        let fetchError = error as NSError
        print(fetchError)
    }
let fetchRequest:NSFetchRequest
如果可用(iOS 10.0,*){
fetchRequest=Params.fetchRequest()
}否则{
fetchRequest=NSFetchRequest(entityName:“Params”)
}
//let谓词=NSPredicate(格式:“key=%@”,key)
//fetchRequest.predicate=谓词
做{
let results=try context.fetch(fetchRequest)
如果(results.count!=0){
让params=NSEntityDescription.insertNewObject(forEntityName:“params”,into:context)作为!params
参数setValue(值,forKey:“值”)
做{
尝试context.save()
}将let错误捕获为NSError{
打印(“错误第一需求方插入\(错误)”)
}
}else if(results.count==0){
让params=NSEntityDescription.insertNewObject(forEntityName:“params”,into:context)作为!params
params.key=key
参数值=值
context.insert(参数)
}
}抓住{
让fetchError=错误为NSError
打印(获取错误)
}
解决方案:

警告,您必须删除数据模型检查器中的模块,并将其设置为全局命名空间

您必须在代码上执行此操作:

    let fetchRequest : NSFetchRequest<NSFetchRequestResult>

    if #available(iOS 10.0, *) {
        fetchRequest = Params.fetchRequest()
    } else {
        fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Params")
    }

    //let predicate = NSPredicate(format: "key=%@", key)
    //fetchRequest.predicate = predicate

    do {
        let results = try context.fetch(fetchRequest)

        if(results.count != 0){

            let params = NSEntityDescription.insertNewObject(forEntityName: "Params", into: context) as! Params

            params.setValue(value, forKey: "value")

            do {
                try context.save()
            } catch let error as NSError {
                print ("Error first demande insertion \(error)")
            }

        } else if (results.count == 0) {

            let params = NSEntityDescription.insertNewObject(forEntityName: "Params", into: context) as! Params

            params.key = key
            params.value = value

            context.insert(params)
        }


    } catch {
        let fetchError = error as NSError
        print(fetchError)
    }
let fetchRequest:NSFetchRequest
如果可用(iOS 10.0,*){
fetchRequest=Params.fetchRequest()
}否则{
fetchRequest=NSFetchRequest(entityName:“Params”)
}
//let谓词=NSPredicate(格式:“key=%@”,key)
//fetchRequest.predicate=谓词
做{
let results=try context.fetch(fetchRequest)
如果(results.count!=0){
让params=NSEntityDescription.insertNewObject(forEntityName:“params”,into:context)作为!params
参数setValue(值,forKey:“值”)
做{
尝试context.save()
}将let错误捕获为NSError{
打印(“错误第一需求方插入\(错误)”)
}
}else if(results.count==0){
让params=NSEntityDescription.insertNewObject(forEntityName:“params”,into:context)作为!params
params.key=key
参数值=值
context.insert(参数)
}
}抓住{
让fetchError=错误为NSError
打印(获取错误)
}

不相关,但为什么不
self.bankfeeepercentage=1.5
?你知道forKeyPath的真正用途吗?@vadian我无法通过self访问属性。forKeyPath,它是关于数据库的,不相关,但为什么不
self.bankFeePercentage=1.5
?你知道forKeyPath的真正用途吗?@vadian我无法通过self访问属性。forKeyPath是关于数据库的