安全更新NSManagedObjects的键值

时间:2018-12-10 21:57:33

标签: ios swift core-data key-value-coding

我正在尝试传递键值对,并通过循环更新属性。

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

我喜欢同时拥有这两种选择...以及其他任何安全/快捷的选择...

1 个答案:

答案 0 :(得分:2)

我遇到了这个确切的问题。这就是你的工作。

使用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执行相同的操作。