安全地更新 NSManagedObjects 的键值
update key values of NSManagedObjects safely
我正在尝试传递键值对并通过循环更新属性。
func update(storableClass : NSManagedObject.Type, id: ID, fields: [String : Any]) throws {
// retreive manaagedObject
for (key, value) in fields {
manaagedObject.setValue(value, forKey: key)
}
}
显然,如果密钥不存在,setValue(_:forKey:)
将抛出异常。
据我了解 you're not to catch Swift 中的一个 Objective-C 异常。
有什么安全的方法可以通过字典更新核心数据属性吗?
我知道我可以有如下功能:
func update(storableClass : ManagedObject.Type, id: ID, closure: (ManagedObject) -> ()) throws {}
然后这样称呼它:
update(storableClass: UserEntity.self, id: "123123", closure: { userEntity in
userEntity.name = "new name"
})
我喜欢这两个选项...以及任何其他 safe/swifty 选项...
我遇到过这个问题。这就是你要做的。
使用 Core Data,您可以轻松找出哪些 属性 名称对对象有效。获取对托管对象实体的引用,然后向实体询问属性。你会使用 managedObject.entity.propertiesByName
。结果是一个字典,其中的键是有效的属性。代码类似于
let properties = managedObject.entity.propertiesByName
for (key, value) in fields {
if properties[key] != nil {
managedObject.setValue(value, forKey: key)
} else {
print("Unknown key: \(key)")
}
}
只要 value
类型正确就可以了。如果您开始在 JSON 中获取伪造的数据类型,您需要解决一个更复杂的问题。
对于关系,对managedObject.entity.relationshpsByName
做同样的事情。
我正在尝试传递键值对并通过循环更新属性。
func update(storableClass : NSManagedObject.Type, id: ID, fields: [String : Any]) throws {
// retreive manaagedObject
for (key, value) in fields {
manaagedObject.setValue(value, forKey: key)
}
}
显然,如果密钥不存在,setValue(_:forKey:)
将抛出异常。
据我了解 you're not to catch Swift 中的一个 Objective-C 异常。
有什么安全的方法可以通过字典更新核心数据属性吗?
我知道我可以有如下功能:
func update(storableClass : ManagedObject.Type, id: ID, closure: (ManagedObject) -> ()) throws {}
然后这样称呼它:
update(storableClass: UserEntity.self, id: "123123", closure: { userEntity in
userEntity.name = "new name"
})
我喜欢这两个选项...以及任何其他 safe/swifty 选项...
我遇到过这个问题。这就是你要做的。
使用 Core Data,您可以轻松找出哪些 属性 名称对对象有效。获取对托管对象实体的引用,然后向实体询问属性。你会使用 managedObject.entity.propertiesByName
。结果是一个字典,其中的键是有效的属性。代码类似于
let properties = managedObject.entity.propertiesByName
for (key, value) in fields {
if properties[key] != nil {
managedObject.setValue(value, forKey: key)
} else {
print("Unknown key: \(key)")
}
}
只要 value
类型正确就可以了。如果您开始在 JSON 中获取伪造的数据类型,您需要解决一个更复杂的问题。
对于关系,对managedObject.entity.relationshpsByName
做同样的事情。