如何在保存到核心数据之前验证上下文中的值

时间:2012-01-03 01:12:29

标签: iphone objective-c core-data

在将内容保存到核心数据之前,我们如何验证上下文?我的想法是在将其保存到核心数据之前我应该​​进行一些验证,如果值不满足验证,则coredata不应保存值。比方说,我有实体候选人的名字,类,年龄等属性。我应该验证值不应该为零。如果它为零,则不应保存其他值。

在这方面有人可以帮助我

EDITED: 我只需要在保存时检查它们,并且应该使用核心数据

3 个答案:

答案 0 :(得分:0)

我喜欢在保存例程中进行catchall验证。在实际执行调用以保存上下文之前,请遍历其insertedObjects数组并确保它们符合您的要求。如果不是,您可以删除它们或提醒用户他们需要完成某些操作(如果是后者,则退出方法;让用户有机会解决问题)。

当您从文本字段或复选框中获取值以分配给您的托管对象时,其他验证应位于输入点。如果出现问题,请立即告知用户。

还要检查NSNumberFormatter,它可以应用于字段,防止用户开始输入错误的条目。

答案 1 :(得分:0)

Coredata在插入其值时会自行验证。在managedObject类中,我们可以编写自定义验证,以便coredata在保存值之前检查验证。如果该值无效,则上下文中的值将不会保存到coredata。

我在这里添加了

@interface
-(BOOL) validateForInsert:(NSError **)error;

@implementation
-(BOOL) validateForInsert:(NSError **)error {
   // check the value of the field with validation
     if(condition == true) {
      return Yes;
     }
 return NO;
}

(NSError **)是一个特殊参数,它使coredata像委托方法一样调用此方法

答案 2 :(得分:0)

对不起,当我第一个回答时,我没有仔细阅读你的问题。您没有验证单个attrs的单个条目是否正确,而是除非为该对象填充所有 attrs,否则不应保存任何更改。

查看Apple doc“Model Object Validation”,您关注 inter - 属性验证,而不是属性验证,并且您正在考虑使用{{1 }} 以此目的。

该文档也提供了示例。以下是您描述的特定实体的可能实现:

validateForInsert:

但是,此方法在插入阶段发生,而不是在保存阶段。

如果要同时收集新实体的条目,则在插入阶段进行验证是有意义的 - 如果该对象注定要被丢弃为不完整,则不要向上下文添加新对象。 如果您正在收集对现有对象进行更改的条目,并且您希望确保所有这些更改在接受任何更改之前一起工作,- (BOOL)validateForInsert:(NSError **)error { if (self.name && self.class && self.age) return [super validateForInsert:error]; else return NO; } 会有意义 - 但是没有办法将对象还原到它的原始状态除了通过重新打开上下文而不保存,除非您已将其原始值缓存在其他位置。 如果你想在保存对象之前单独收集attrs并等待检查它们是否完整,我认为你会按照我的第一个建议做:循环遍历上下文的insertedObjects并在实际保存上下文之前进行验证。没有现有的validateForUpdate:方法可以覆盖,但您可以添加一个。

您还可以组合这些技术:收集条目并创建新对象而不插入它们,但将所有这些对象缓存在数组中。当需要保存时,循环缓存并仅在对象通过validateForSave:时将对象插入上下文;然后保存上下文。

显然我正在和你一起学习,所以上面的内容可能不完全是cookie。希望Apple doc足以让你入门。