Обновление основного объекта данных swift 3

Я хочу обновить основной объект данных в swift 3. После некоторых googled я ничего не нашел о swift 3. Поэтому мой вопрос: как я могу обновить основной объект данных в swift 3?

Ответ 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)
}

Пакетные обновления

Пакетные обновления помогают обновить несколько объектов Core Data без необходимости извлечения чего-либо в память.

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" (уникальная переменная, созданная в модели данных Core) и все переменные, как вы хотите обновить значения:

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()
    }
}