2

我在最大长度值为 40 的核心数据实体中有一个字符串属性。我想在代码中使用此值,而不必重新键入值“40”。这可能吗?

4

2 回答 2

2

正如@K.Steff 在上面的评论中所说,您最好在代码中进行验证,而不是在核心数据模型中设置最大长度。为了补充该评论,我还建议您查看为此实体类型使用自定义 NSManagedObject 子类,并在该子类中覆盖validateValue:forKey:error:或实现此属性的特定于键的验证方法。

这种方法的价值在于,您可以通过在验证时截断字符串来“强制”验证。从 NSManagedObject 文档:

此方法负责两件事:将值强制转换为对象的适当类型,并根据对象的规则对其进行验证。

NSManagedObject 提供的默认实现参考对象的实体描述来强制值并检查基本错误,例如在不允许的情况下为空值以及为属性指定字段宽度时的字符串长度。然后它搜索 validate< Key >:error: 形式的方法,如果存在则调用它。

您可以实现 validate< Key >:error: 形式的方法,以执行使用属性描述中可用的约束无法执行的验证。如果它发现一个不可接受的值,你的验证方法应该返回 NO 并且错误地返回一个描述问题的 NSError 对象。有关更多详细信息,请参阅“模型对象验证”。对于属性间验证(检查无效值的组合),请参阅 validateForUpdate: 和相关方法。

因此,您可以实现此方法来验证字符串是否太长,并在必要时在太长时将其截断。

于 2012-06-12T21:43:42.540 回答
1

NSManagedObject您可以访问NSEntityDescriptionvia entity。在那里,您可以获取数组properties和字典propertiesByName,其中任何一个都会让您进入NSPropertyDescriptions. 每个属性描述都有一个属性,validationPredicates它将返回一个NSPredicates 数组。其中之一是您的字符串长度必须最多为 40。

遗憾的是,谓词对于逆向工程来说非常麻烦——而且这样做甚至是不可能的,因为您可以通过提供一个块来创建一个。希望尽管您只有一个NSComparisonPredicate或能够从一个NSCompoundPredicate或一个向下走的树上到达一个NSExpression

从比较谓词中,您将能够从左右表达式中发现一个是字符串长度,另一个是常量值。

所以,总结一下:

  • Core Data 仅通过非常通用的谓词方式公开验证标准;
  • 您通常(但并非总是NSExpression)可以从谓词重建表达式(在自然语言意义上而不是意义上);和
  • 如果您明确知道您只是在某处寻找长度比较,那么您可以将其进一步简化为树遍历,以进行涉及长度的比较谓词。

由于具体和一般的不匹配,它肯定不会很漂亮,但这是可能的。

于 2012-06-12T21:04:17.177 回答