解释核心数据验证消息并在iPhone上显示它们有什么好的模式?

时间:2010-08-16 09:17:42

标签: iphone design-patterns validation core-data

我使用Core Data实现了一个小概念验证应用程序,通过文本字段接受用户的一些对象属性值,并且由于此处和iPhone Core Data Recipes应用程序中的信息,它们都运行良好。但我现在需要向用户显示对象验证错误,我找不到推荐的处理方法。 Recipe应用程序中的代码只记录错误并说“用代码替换此实现以适当地处理错误”。太好了,谢谢。

我确信有多种方法可以解释,解析并将验证错误信息传递给用户,但我想知道的是,是否有某些最佳实践或模式已经实现了我可以跟着。应该在哪里放置像[newObject valdiateForInsert&error];这样的验证码?在NSManagedObject子类中?在处理屏幕的UIViewController中,是否允许添加对象?也许在app范围内的ValidationController?

所有验证错误都在NSError的userInfo中返回,该用户信息是各种NSValidation密钥和值的NSDictionary。有没有一种很好的方法可以将此错误信息转换为对用户有帮助的内容?例如,我的核心数据模型中有一条规则,某个属性只能是3个字符。如果在保存或更新对象的过程中我得到验证错误,我需要解析NSError userInfo并找到NSValidationErrorKey(属性的名称)的值,NSValidationErrorValue(导致错误的对象上的值) )和NSValidationErrorPredicate(违反的规则,在这种情况下返回length <= 3

是否有一种良好的,普遍接受的方式来收集和将这些数据整合到可以传递给用户的内容中?我现在正在将NSError信息拉入字符串,然后通过一系列条件语句对我正在验证的每个属性进行处理,而且它太丑了以至于当我查看它时我有点想呕吐。必须有一种更好,更清晰的方式来使用Core Data验证错误并将可读版本传递给用户。

1 个答案:

答案 0 :(得分:7)

用户无法进行验证。它们在那里,因此代码可以保持对象图的完整性。在保存上下文之前,托管对象上下文不会调用验证方法。那段时间可能与输入时间相距甚远。

但是,您可以在设置属性之前直接调用对象验证方法。验证方法的格式为:

- (BOOL)validateTimeStamp:(id *)valueRef error:(NSError **)outError;

假设您有一个托管对象子类name的属性PeopleMO。检查空字符串的验证方法可能如下所示:

- (BOOL)validateName:(id *)valueRef error:(NSError **)outError{
    BOOL isValid=NO;
    NSString *toTest=(NSString *) valueRef;
    if (![toTest isEqualToString:@""]) {
        isValid=YES;
    }
    return isValid;
}

您可以在任何地方调用它:

NSString *newName=// some UI element text 
PersonMO *newPerson=//.. insert new PersonMO object
if ([newPerson validateName:newName error:nil]) {
    newPerson.name=newName;
}else{
    //... inform user name is invalid
    // ... possibly delete newPerson object from context
}

如果您遇到一个属性值的有效性取决于同一对象的一个​​或多个其他属性的情况,这将非常有用。