与在核心数据中保存新对象相比,更新核心数据中现有属性的语法是什么?

What's the syntax for updating existing attributes in core data compared to saving a new object in core data?

向核心数据添加新数据的语法与更新核心数据中的现有数据的语法有何不同。例如,如果我有一个核心数据实体 Person 和属性名称:String,性别:String,和 last_occupation: [Int : String](其中 Int 对应于他们退出时的年龄),我很困惑哪个我已经知道应该使用的两种语法中的一种。

let appDelegate = UIApplication.shared.delegate as? AppDelegate
let context = appDelegate.persistentContainer.viewContext
let container = NSEntityDescription.insertNewObject(forEntityName: "Person", into: context) as! Person

//And then assigning attributes

container.name = some_string
container.gender = some_string
container.last_occupation = custom_object_that_conformsTo_codable_protocol

VS

let fetchRequest = NSFetchRequest(entityName: "Person")
let results = try context.fetch(fetchRequest)
if let container = results.first {
   container.name.value = some_string
   container.gender.value = some_string
   container.last_occupation = custom_object
   try context.save()
   context.refresh(transformableContainer, mergeChanges: false)
}

我什么时候应该使用一种方法而不是另一种方法,如果我知道我将用新更新的属性替换核心数据中的现有属性而不是仅仅更改它们的值,可以使用第一种方法吗?

  • 第一个语法插入一条新记录——之后你必须保存上下文。

  • 第二种语法获取现有数据并更新一条记录。

然而,要更新特定记录,您必须添加谓词,而且您很可能不想更新 namegender 属性

let name = "John Doe"
let fetchRequest : NSFetchRequest<Person> = Person.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", name)
let results = try context.fetch(fetchRequest)
if let container = results.first {
   // container.name = some_string
   // container.gender = some_string
   container.last_occupation = custom_object
   try context.save()
   context.refresh(transformableContainer, mergeChanges: false)
}