使用键值编码进行核心数据验证

时间:2013-09-18 13:53:14

标签: ios validation core-data kvc

我创建了一个Core Data模型并创建了一个类别类,其中包含更新和删除数据的方法。我正在尝试向类中添加验证方法并尝试使用KVC但是稍微挣扎。

我的问题是这个,我的验证方法仅在我实际保存上下文[context save:& internalError]时触发,它们工作正常但保存过程也完成了。我的问题是,触发验证的时间是什么时候可以在保存之前触发,还是我完全错了?

我的代码:

+(int)doSmeThing:(InstructionMessageObject *)message inManagedObjectContext:(NSManagedObjectContext *)context error:(NSError **)error {

    NSError *internalError = nil;    
    int timeStamp = [[NSDate date] timeIntervalSince1970];

    NSManagedObject *newMessageObject = [NSEntityDescription insertNewObjectForEntityForName:@"CoreDataTable"inManagedObjectContext:context];    
    [newMessageObject setValue:message.productCode forKey:@"productCode"];
    [newMessageObject setValue:message.quantity  forKey:@"quantity"];

///////////////////////////////////////
// Need to validate HERE before save //
///////////////////////////////////////

    if (![context save:&internalError]) {
        *error = internalError;
    return NO;
    }

    return YES;
}


- (BOOL)validateProductCode:(id *)ioValue error:(NSError **)outError {
    *outError = nil;
    if ([*ioValue integerValue] < 1 ) {
        *outError = [NSError errorWithDomain:@"domain" code:101 userInfo:[NSDictionary dictionaryWithObject:@"Invalid Product Code" forKey:NSLocalizedDescriptionKey]];
        return NO;
    }
    return YES;
}

- (BOOL)validateQuantity:(id *)ioValue error:(NSError **)outError {
    *outError = nil;
    if ([*ioValue integerValue] < 1 ) {
        *outError = [NSError errorWithDomain:@"domain" code:102 userInfo:[NSDictionary dictionaryWithObject:@"Invalid Quantity" forKey:NSLocalizedDescriptionKey]];
        return NO;
    }
    return YES;
}

1 个答案:

答案 0 :(得分:2)

来自the docs

  

了解如何验证是一种模型非常重要   决定,何时验证是用户界面或控制器级别   决定(例如,文本字段的值绑定可能具有它   “立即验证”选项已启用)。

还有:

  

没有什么可以禁止内存中的对象成为   暂时不一致。验证约束是   仅在“保存”操作期间或根据请求由Core Data应用   (您可以根据需要直接调用验证方法)。   有时,尽快验证更改可能很有用   制作并立即报告错误。

请注意,当他们说“您可以直接调用验证方法”时,我认为它们并不意味着您应该实际调用特定于属性的验证方法,因为在此之后会有一个注释:

  

重要提示:如果您确实实现了自定义验证方法,则通常不应直接调用它们。相反,你应该打电话   validateValue:forKey:error:使用适当的密钥。这确保了   管理对象模型中定义的任何约束也是   应用

因此,只有在保存上下文时调用验证方法这一事实并不令人惊讶 - 这就是Core Data进行验证的时候。也就是说,您可以更频繁地进行验证,如果您选择这样做,则应通过拨打-validateValue:forKey:error:进行验证。