解释 Core Data 验证消息并在 iPhone 上显示它们的好模式是啥?

Posted

技术标签:

【中文标题】解释 Core Data 验证消息并在 iPhone 上显示它们的好模式是啥?【英文标题】:What is a good pattern for interpreting Core Data validation messages and displaying them on the iPhone?解释 Core Data 验证消息并在 iPhone 上显示它们的好模式是什么? 【发布时间】:2010-08-16 09:17:42 【问题描述】:

我已经使用 Core Data 实现了一个小型的概念验证应用程序,通过文本字段从用户那里接受一些对象属性值,这一切都很好,这要归功于此处和 iPhone Core Data Recipes 应用程序中的信息。但是我现在需要向用户显示对象验证错误,但我找不到推荐的处理方法。食谱应用程序中的代码只记录错误并说“用代码替换此实现以适当地处理错误”。太好了,谢谢。

我确信有多种方法可以解释、解析和传输验证错误信息给用户,但我想知道是否有一些最佳实践或有人已经实现的模式我可以跟随。 [newObject valdiateForInsert&error]; 之类的验证码应该放在哪里?在 NSManagedObject 子类中?在处理屏幕的 UIViewController 中,可以添加对象吗?也许在应用范围的 ValidationController 中?

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

是否有一种良好的、普遍接受的方式来收集这些数据并将其转换成可以传回给用户的东西?我目前正在将 NSError 信息提取到字符串中,然后针对我正在验证的每个属性执行一系列条件语句,它是如此丑陋,以至于当我看到它时我有点想吐。必须有一种更好、更简洁的方式来处理 Core Data 验证错误并将可读版本传递给用户。

【问题讨论】:

【参考方案1】:

没有为用户提供验证。它们在那里,因此代码可以保持对象图的完整性。在保存上下文之前,托管对象上下文不会调用验证方法。那个时间可能离输入的时间很远。

但是,您可以在设置属性之前直接调用对象验证方法。验证方法具有以下形式:

- (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

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

【讨论】:

我的目标是在不需要时不重复验证检查。如果我设置 xcdatamodel 以便需要属性或具有最小/最大长度值或仅需要数字,那么我希望能够使用 Core Data 的 validateForInsert 和 validateForUpdate 方法为我进行所有验证检查。我可以使用从它们传回的任何 NSError 对象并将其解析出来,这样我就可以为最终用户提供更正输入值所需的信息。我只是在寻找一种好的/标准/高效/可接受的方式来实现这一点。

以上是关于解释 Core Data 验证消息并在 iPhone 上显示它们的好模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Core Data iphone调试指针

是否可以在开发 iphone 上查看存储在 Core Data 中的数据?

iPhone iOS Core Data 我应该为我的实体子类化一个抽象实体吗?

如何正确使用 Core Data 验证和错误框架?

iPhone在Core Data中保存多个对象?

iPhone:为啥 Core Data 中的 Bulk Inserts 这么慢?