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