【问题标题】:update key values of NSManagedObjects safely安全更新 NSManagedObjects 的键值
【发布时间】:2018-12-10 21:57:32
【问题描述】:

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

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

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

【问题讨论】:

  • @rmaddy 如果我错了,请纠正我。我认为objective-c 是相关的,因为NSManagedObject 基于NSObject 而setValue 函数来自objective-c...
  • 每个 UI 类也是用 Objective-C 编写的。您的问题是关于 Swift 以及如何处理在 Swift 中使用未知键错误地调用 setValue。对您来说更好的问题是,您为什么要使用未知密钥调用 setValue?那是编程错误。你应该尝试捕捉异常,你应该避免引起它。
  • 嗯。您的意思是 这是一个编程错误 与 用户 错误或我无法控制的东西,例如服务器?
  • 服务器不应返回您的 CD 中不存在的密钥
  • 正确。编写不正确的代码和正确处理数据是有区别的。

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


【解决方案1】:

我遇到了这个确切的问题。这就是你要做的。

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

【讨论】:

  • FWIW 还有一个名为entity() 的类型函数,它具有相同的propertiesByName 和relationshpsByName。还可以找到来自 Tom 的非常好的相关读物here
  • 嗨,汤姆,节日快乐。有机会可以看看here。我不认为它需要任何编码,希望你能在你的头脑中验证我的观察:)
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
相关资源
最近更新 更多