快速更新核心数据上的对象 4

Posted

技术标签:

【中文标题】快速更新核心数据上的对象 4【英文标题】:Update an object on core data swift 4 【发布时间】:2018-02-12 06:01:26 【问题描述】:

我在核心数据实体中有几项工作,其 jobId 为 -1。我需要通过 updateMyJobs 方法中传递的对象中的正确 id 获取所有这些项目并更新 jobId。我还没有提取 NSManagedObject 类来处理核心数据(即 - 我已经检查了实体作为类定义)

这是我的代码:

func updateMyJobs(jobId: Int)
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "DBJobsNearBy")
    fetchRequest.predicate = NSPredicate(format: "jobId = '-1'")
    let result = try? managedObjectContext.fetch(fetchRequest)
    let resultData = result as! [DBJobsNearBy]
    for object in resultData 
        print(object.jobId)
        if object.jobId == -1 
            object.setValue("\(jobId)", forKey: "jobId")
        
    
    do 
        try managedObjectContext.save()
        print("saved!")
     catch let error as NSError  
        print("Could not save \(error), \(error.userInfo)")
    

我传递了一些整数值并调用上面的方法来更新这样的项目。

DatabaseHandler.shared.updateMyJobs(jobId: 222)

错误:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“属性值的不可接受类型:property = “jobId”;所需类型 = NSNumber;给定类型 = Swift._NSContiguousString;值 = 222。'

我正在尝试将新的 jobId 设置为核心数据实体中的相关对象。是否有必要提取 NSManagedObject 类。请有人帮我做这件事。谢谢。

【问题讨论】:

你是说 jobId 是一个单独实体的键,与 DBJobsNearBy 有关系,你想设置这种关系吗?如果是这样,请展示您的数据模型。 与 DBJobsNearBy 没有关系。我从网络上获取了多个 jobId,并希望在其 id 为 -1 的 coredata jobIds 上更新它们。 【参考方案1】:

请阅读错误信息。很清楚。在setValue 中,您传递的是String(通过字符串插值)而不是预期的IntNSNumber

object.setValue(jobId, forKey: "jobId")

object.setValue(NSNumber(value: jobId), forKey: "jobId")

但最好和推荐的方法是点表示法

object.jobId = jobId

【讨论】:

您的代码使用jobId 参数更新resultData 中的所有对象。 然而它会更新所有对象,但它会按最后一个 jobId 更新所有对象。我从网络上获取了多个 jobId,并希望在其 id 为 -1 的 coredata jobIds 上更新它们 但是只有一个jobID作为参数。如果要更改多个不同的值,则需要更改逻辑。 请告诉我逻辑。 我无法读懂你的想法。目前还不清楚你要完成什么。【参考方案2】:

将对象更新为核心数据

@IBAction func buttonUpdate(_ sender: Any) 
        let entity = NSEntityDescription.entity(forEntityName: "Students", in: managedContext)
        let request = NSFetchRequest<NSFetchRequestResult>()
        request.entity = entity
        let newName = UserDefaults.standard.value(forKey: "new") as! String
        let predicate = NSPredicate(format: "(name = %@)", newName)
        request.predicate = predicate
        do 
            let results =
                try managedContext.fetch(request)
            let objectUpdate = results[0] as! NSManagedObject
            objectUpdate.setValue(txtName.text!, forKey: "name")
            objectUpdate.setValue(txtPhone.text!, forKey: "phone")
            objectUpdate.setValue(txt_Address.text!, forKey: "address")
            do 
                try managedContext.save()
                labelStatus.text = "Updated"
            catch let error as NSError 
              labelStatus.text = error.localizedFailureReason
            
        
        catch let error as NSError 
            labelStatus.text = error.localizedFailureReason
        

    

【讨论】:

【参考方案3】:

您需要设置NSNumber 而不是String。替换这一行:

object.setValue("\(jobId)", forKey: "jobId")

与:

object.jobId = jobId

【讨论】:

此代码更新了 jobId,但它为每个项目更新了相同的值。请帮助我根据 objectId 进行更新,以便所有 jobId 都将更新为正确的 id。

以上是关于快速更新核心数据上的对象 4的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据数组中删除对象(核心数据)

在初始加载时快速重置核心数据属性标志?

更新 didSelectRowAtIndexPath 上的核心数据

为一个对象快速保存多个核心数据关系

核心数据保存竞争条件错误

数据插入上的核心数据级联