核心数据:基于谓词的验证

Posted

技术标签:

【中文标题】核心数据:基于谓词的验证【英文标题】:Core Data: Predicate-based validation 【发布时间】:2015-04-17 11:10:31 【问题描述】:

我正在处理托管对象验证。到目前为止,我已经完成了属性级验证。现在我正在冥想以上属性验证。我可以通过一个大的 if-else 控制流来做到这一点,但想知道是否有更优雅的选择。

我找到了NSValidationPredicateErrorKey

对于基于谓词的验证, 验证失败的条件。

在文档中。

不知何故,我觉得这可能是我的选择,但我在这个主题上一无所获。我搜索了官方文档、SO、知名博客、Marcus S. Zarra 的核心数据书。

那么什么是基于谓词的验证?它甚至存在吗?如果没有记录,它是否相关?有哪些用例?如果是跨属性验证,示例是什么?

【问题讨论】:

inter-property validation 是什么意思? "There are two types of validation—property-level and inter-property. You use property-level validation to ensure the correctness of individual values; you use inter-property validation to ensure the correctness of combinations of values." 【参考方案1】:

只需覆盖托管对象子类中的validateForInsertvalidateForUpdate 即可实现属性间验证,如here 中的文档所示(带有代码示例)。

“基于谓词”的验证可以通过丰富的托管对象 API 来实现。每个NSManagedObject 都有一个关联的NSEntityDescription(称为entity 的属性)。通过这个您可以访问每个属性的NSPropertyDescription。属性描述又具有一个名为validationPredicates 的属性,这是一个用于验证的NSPredicates 数组。请注意,这些是只读的,它们主要用于在验证错误的情况下通知错误对象。此外,据我了解,它们不能总是充分描述上述覆盖中发生的验证。

总而言之,您发现的这个错误键并不真正表明存在指定验证约束的通用、基于谓词的方法。相反,您必须在托管对象类中覆盖上述方法。

【讨论】:

当然。但我的问题是文档中“基于谓词的验证”的含义。 对。我扩展了我的答案来解释。

以上是关于核心数据:基于谓词的验证的主要内容,如果未能解决你的问题,请参考以下文章

核心数据谓词啥都不返回?

并行验证谓词,线程池中的线程返回 true 时立即返回

在核心数据谓词中为元素名称使用变量

NSTreeController 基于瞬态 isRoot 异常获取谓词

如何使用基于 cookie 的身份验证授权 Web API

SpringDataJpa