快速更新核心数据对象 3

Posted

技术标签:

【中文标题】快速更新核心数据对象 3【英文标题】:Update core data object swift 3 【发布时间】:2016-08-03 18:58:28 【问题描述】:

我想在 swift 3 中更新一个核心数据对象。经过一番谷歌搜索后,我没有找到任何关于 swift 3 的信息。 所以我的问题是:如何在 swift 3 中更新核心数据对象?

【问题讨论】:

您认为在 Swift 3 中更新托管对象有何不同?您是否遇到了 Swift 2 中没有出现的特定问题?如果是这样,请分享更多详细信息。 【参考方案1】:

使用带有谓词的获取请求获取现有值。在谓词中使用唯一值。获取对象后,使用新值更新对象并保存上下文。

let empId = "001"
let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "EmpDetails")
let predicate = NSPredicate(format: "empId = '\(empId)'")
fetchRequest.predicate = predicate
do 
    let result = try persistentContainer.viewContext.fetch(fetchRequest)
    if let objectToUpdate = result.first as? NSManagedObject 
        objectToUpdate.setValue("newName", forKey: "name")
        objectToUpdate.setValue("newDepartment", forKey: "department")
        objectToUpdate.setValue("001", forKey: "empID")
        try persistentContainer.viewContext.save()
    
 catch 
    print(error)

使用 NSManagedObject 子类

let empId = "001"
let fetchRequest: NSFetchRequest<Employee> = Employee.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "%K = %@", #keyPath(Employee.id), empId)
do 
  let results = try persistentContainer.viewContext.fetch(fetchRequest)
  if let employee = results.first 
    employee.name = "new name"
    employee.department = "new department"
  
  try persistentContainer.viewContext.save()
 catch let error as NSError 
  print(error.localizedDescription)


批量更新

批量更新有助于更新多个核心数据对象,而无需 将任何内容提取到内存中。

let batchUpdate = NSBatchUpdateRequest(entityName: "Employee")
batchUpdate.propertiesToUpdate = [#keyPath(Employee.isActive): true]
batchUpdate.affectedStores = persistentContainer.viewContext.persistentStoreCoordinator?.persistentStores
batchUpdate.resultType = .updatedObjectsCountResultType
do 
  let batchResult =  try coreDataStack.managedContext.execute(batchUpdate) as? NSBatchUpdateResult
  print(batchResult?.result)
 catch let error as NSError 
  print(error.localizedDescription)

【讨论】:

工作就像一个魅力!【参考方案2】:

在变量“id”(在核心数据模型中创建的唯一变量)中传递唯一 id 以及您想要更新值的所有变量:

func context() ->  NSManagedObjectContext 
    let context=(UIApplication.shared.delegate as!AppDelegate).persistentContainer.viewContext
        return context




func save() 
    (UIApplication.shared.delegate as! AppDelegate).saveContext()


func UpdateCartByTestId(id:Int64,name:String) 
    let fetchRequest =
            NSFetchRequest<NSManagedObject>(entityName: "Update")
    fetchRequest.returnsObjectsAsFaults = false
    fetchRequest.predicate = NSPredicate(format:"id == %d",id)

    let result = try? context().fetch(fetchRequest)

    if result?.count == 1 

        let dic = result![0]
        dic.setValue(id, forKey: "id")
        dic.setValue(name, forKey: "name")
        save()
    

【讨论】:

您能否在您的答案中添加更多关于您的解决方案的详细信息? 在变量“id”(在核心数据模型中创建的唯一变量)中传递唯一 id 以及您想要更新值的所有变量。

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

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

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

后台位置的核心数据更新位置导致阻塞 UI

Spring IOC核心功能快速入门

核心数据对象循环更新

如何更新核心数据中的对象?