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

Iphone 如何在保存到核心数据之前验证上下文中的值,iphone,objective-c,core-data,Iphone,Objective C,Core Data,我们如何在将上下文保存到核心数据之前验证它?。我的想法是,我应该在将其保存到核心数据之前进行一些验证,如果值不满足验证要求,则核心数据不应该保存这些值。比如说,我有实体候选者的属性,比如名称、类别、年龄等。我应该验证这些值不应该为零。如果为nil,则不应保存其他值 在这方面有人能帮我吗 编辑: 我只需要在保存时检查它们,这应该通过核心数据来完成我喜欢在保存例程中执行catchall验证。在实际执行保存上下文的调用之前,请遍历其insertedObjects数组,并确保它们符合您的要求。如果它们不

我们如何在将上下文保存到核心数据之前验证它?。我的想法是,我应该在将其保存到核心数据之前进行一些验证,如果值不满足验证要求,则核心数据不应该保存这些值。比如说,我有实体候选者的属性,比如名称、类别、年龄等。我应该验证这些值不应该为零。如果为nil,则不应保存其他值

在这方面有人能帮我吗

编辑:
我只需要在保存时检查它们,这应该通过核心数据来完成

我喜欢在保存例程中执行catchall验证。在实际执行保存上下文的调用之前,请遍历其insertedObjects数组,并确保它们符合您的要求。如果它们不是,您可以删除它们或提醒用户需要完成某些事情(如果是后者,则返回方法;给用户一个修复问题的机会)

当您从文本字段或复选框中获取要分配给托管对象的值时,其他验证应该在输入点进行。如果有问题,请立即让用户知道


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

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调用此方法就像调用委托方法一样

对不起,我在给出第一个答案时没有仔细阅读您的问题。您并不是在验证单个属性的各个条目是否正确,而是在为该对象填充所有属性之前,不应保存任何更改

查看Apple doc“”,您关心的是属性间验证,而不是属性验证,您正在考虑使用
validateForInsert:
实现此目的

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

- (BOOL)validateForInsert:(NSError **)error {
if (self.name && self.class && self.age)
    return [super validateForInsert:error];
else
    return NO;
}
但是,此方法发生在插入阶段,而不是保存阶段

如果一次收集一个新实体的条目,那么在插入阶段进行验证是有意义的——如果一个新对象注定会因为不完整而被丢弃,那么不要将该对象添加到上下文中。 如果您正在收集对现有对象所做更改的条目,并且希望在接受任何更改之前确保所有这些更改都能协同工作,
validateForUpdate:
,这是有意义的-但是除了在不保存的情况下重新打开上下文,将无法将对象恢复到其原始状态,除非您已将其原始值缓存到其他位置。 如果您想单独收集属性,并在保存对象之前等待检查它们是否都已完成,我想您应该按照我最初的建议执行:在实际保存上下文之前循环上下文的insertedObjects并进行验证。没有要重写的现有
validateForSave:
方法,但您可以添加一个

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


很明显,我是和你一起学习的,所以上面的内容可能不太合适。希望Apple doc足以让您开始使用。

例如,我需要一个属性作为键,如果该属性不是nil,则只应将上下文中的其他值保存到核心数据中。有这样的事吗@维恩克赖特,我误解了你的问题。我在下面发布了另一个答案。这里有些混乱:保存对象就是保存包含对象的上下文——除非对象已经插入到上下文中,否则这是不可能发生的。此外,NSError不调用该方法。通过引用传递空的NSError,如果发生错误,该方法将填充它。新链接为:。另外,在validateForInsert:的前两行中,您混淆了属性级验证(“[super validateForInsert:error]”)和属性间或一致性验证(self.name&&self.class&&self.age)。首先进行属性级验证,然后检查一致性。正如您的代码所示,名称、类别和年龄都无法设置。