安全地更新NSManagedObjects的键值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安全地更新NSManagedObjects的键值相关的知识,希望对你有一定的参考价值。

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

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

我喜欢这两种选择......以及任何其他安全/可靠的选择......

答案

我有这个确切的问题。这是你做的。

使用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做同样的事情。

以上是关于安全地更新NSManagedObjects的键值的主要内容,如果未能解决你的问题,请参考以下文章

无法更新 NSUserDefaults 中字典的键值

我可以在 TypeScript 中创建一个对每个键值对都是类型安全的键值字典吗?

更新mysql中某个json字段的键值

如何使 JavaScript 中每个元素的 map 函数的键值递增

Properties文件工具类的使用--获取所有的键值删除键更新键等操作

在Cassandra中用新的键值对更新地图类型列,而不是完全覆盖地图。