【问题标题】:Core Data Validation using Key Value Coding使用键值编码的核心数据验证
【发布时间】:2013-09-18 13:53:14
【问题描述】:

我创建了一个核心数据模型,并创建了一个类别类,其中包含用于更新和删除数据的方法。我正在尝试向该类添加验证方法并尝试使用 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;
}

【问题讨论】:

  • 据我了解,如果任何验证方法报告错误,save: 操作应该失败(并且不会向商店写入任何内容)。

标签: ios validation core-data kvc


【解决方案1】:

来自the docs

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

还有:

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

请注意,当他们说“您可以直接调用验证方法”时,我不认为他们的意思是您实际上应该调用特定于属性的验证方法,因为在那之后有一条注释:

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

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

【讨论】:

  • 我想我找到了一个我喜欢的解决方案,但会导致一个新问题,我正在使用:[newMessageObject validateForInsert:&internalError] 这会触发我正在处理的所有正确验证,但NSFetchedResultsController 将其视为真正的记录插入和 NSFetchedResultsChangeInsert。 ViewController 显示无效记录,即使它没有保存。退出应用,记录已保存,显示正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多