更新一个属性Core Data中的所有值

时间:2015-08-09 03:58:31

标签: swift core-data

我知道如何使用数组从Core Data中的一个属性获取所有值。我只需要按一个按钮并输出所有值,然后将其保存回核心数据。

如何在swift中更新所有值一次?

感谢。

3 个答案:

答案 0 :(得分:1)

对于swift 3

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Params")

    do{
        if let fetchResults = try managedContext.fetch(request) as? [NSManagedObject] {
            if fetchResults.count != 0 {
                for index in 0...fetchResults.count-1 {
                    let managedObject = fetchResults[index]

                    managedObject.setValue("-1", forKey: "value")
                }

                try managedContext.save()
            }
        }
    } catch let error as NSError {
        print("Could not fetch \(error), \(error.userInfo)")
    }

答案 1 :(得分:0)

尝试以下示例,它可能会有帮助。请替换实体名称。

  var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)

  var context: NSManagedObjectContext = appDel.managedObjectContext!
  var request = NSFetchRequest(entityName: "Params")
  var params = NSEntityDescription.insertNewObjectForEntityForName("Params", inManagedObjectContext: context) as! NSManagedObject

  if let fetchResults = appDel.managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [NSManagedObject] {

       if fetchResults.count != 0{
             for (var v = 0 ; v < fetchResults.count ; v++) {
              var managedObject = fetchResults[v]

             println(fetchResults)
             managedObject.setValue("-1", forKey: "value")
             context.save(nil)

                }
        }
  }

答案 2 :(得分:0)

虽然这个问题很老,但我是为那些希望以更优化的方式完成这项任务的人写的。根据文档,

<块引用>

批量更新比自己在代码中处理核心数据实体运行得更快,因为它们在 SQL 级别的持久存储本身中运行。

因此使用 NSBatchUpdateRequest 是实现结果的最佳方式。这是一个 swift 代码,它可以在给定的场景中使用扩展来帮助简化代码,同时还考虑到批处理更新中所做的更改不会反映在当前内存中的对象中这一事实。

extension NSManagedObjectContext {
    /// Executes the given `NSBatchUpdateRequest` and directly merges the changes to bring the given managed object context up to date.
    ///
    /// - Parameter batchUpdateRequest: The `NSBatchUpdateRequest` to execute.
    /// - Throws: An error if anything went wrong executing the batch deletion.
    public func executeAndMergeChanges(using batchUpdateRequest: NSBatchUpdateRequest) throws {
        batchUpdateRequest.resultType = .updatedObjectIDsResultType
        let result = try execute(batchUpdateRequest) as? NSBatchUpdateResult
        let changes: [AnyHashable: Any] = [NSUpdatedObjectsKey: result?.result as? [NSManagedObjectID] ?? []]
        NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [self])
    }
}
class MyCoreDataClass {
    ...
    func updateAllParams() {
        let request = NSBatchUpdateRequest(entityName: "Params")
        request.propertiesToUpdate = ["value" : NSExpression(forConstantValue: -1)]
        do {
            try managedObjectContext.executeAndMergeChanges(using: request)
        } catch {
            print(error)
        }
    }
}

P.S:您需要注意,在执行批量更新时不会考虑在数据模型中强制执行的验证规则。根据文档,

<块引用>

当您使用批量更新时,作为数据模型一部分的任何验证规则在执行批量更新时都不会强制执行。因此,请确保批量更新引起的任何更改将继续通过验证规则。