如何从代码中访问Core Data Attribute验证信息?

时间:2012-05-16 19:52:23

标签: core-data

我在Core Data实体中有一个字符串属性,其Max Length值为40.我想在代码中使用此值,而不必重新键入值“40”。这可能吗?

2 个答案:

答案 0 :(得分:2)

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

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

  

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

     

NSManagedObject提供的默认实现参考对象的实体    描述强制值并检查基本错误,例如空值时    当为字段宽度指定时,不允许和字符串的长度    属性。然后它搜索表单validate<的方法。键>:错误:并调用它    如果它存在。

     

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

因此,您可以实现此方法,以验证字符串不会太长,如果需要,可以在字符串太长时将其截断。

答案 1 :(得分:1)

NSManagedObject,您可以通过NSEntityDescription访问entity。在那里,您可以获取数组properties和字典propertiesByName,其中任何一个都可以转到NSPropertyDescription。每个属性描述都有一个属性validationPredicates,它将返回NSPredicate的数组。其中一个条件是你的字符串长度必须至多为40。

可悲的是,谓词对逆向工程来说很麻烦 - 这样做甚至是不可能的,因为你可以通过提供一个块来创建一个。希望你只有一个NSComparisonPredicate,或者能够从NSCompoundPredicateNSExpression向下走一棵树。

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

所以,总结一下:

  • 核心数据仅通过一般的谓词方式公开验证标准;
  • 你通常可以(但不总是)从谓词中重建一个表达式(在自然语言意义上而不是NSExpression意义上);和
  • 如果你特别知道你只是想在某个地方寻找长度比较,那么你可以进一步将其简化为树步行,以获得涉及长度的比较谓词。

由于特定和一般的不匹配,它绝对不会很漂亮,但它是可能的。