Preface:
我有两个实体定义为一对多关系:A B。B 与 A 的关系称为 myAs,是一种以 Nullify 作为删除规则的一对多关系。 A到B的逆关系是一对一关系,以Cascade为删除规则。
我已经在 B 类上实现了 validateForDelete,如下所示:
- (BOOL)validateForDelete:(NSError **)error {
[super validateForDelete:error];
BOOL validDelete = FALSE;
if ([self.myAs count] == 0) {
validDelete = TRUE;
}
return validDelete;
}
这样做的目的是仅当不再有 A 对象与其建立关系时才删除对象 B(但如果不再有任何 A 对象与之建立关系,则始终删除 B 对象)。如果我在保存之前手动检查此验证,则 validateForDelete 会按预期工作:在 B 对象删除上:
if ([b validateForDelete:NULL]) {
//delete b object...
[context save:&error];
...
}
我遇到的问题是当 A 对象删除级联删除 B 对象时。用户无法直接访问 B 对象——它们是通过 A 对象创建和删除的。因此,我的规则是,当不再有 A 对象与之关联时,B 对象将被删除,这一规则必须从 A 对象强制执行——因此删除时会出现级联。
问题是,当我删除 A 对象时,由于级联,会在 B 对象上调用 validateForDelete。我收到已解决的错误:未解决的错误(null),(null),因为我没有手动调用 validateForDelete。
问题):
如何以编程方式从级联删除访问 validateForDelete 调用,以便可以传入错误变量和/或处理 FALSE 的 validateForDelete 结果?
如果上述不可能,我应该如何处理这个用例?还有另一种更实用的方法来实现这一目标吗?
提前致谢。
首先,您对 super 的调用会忽略它的响应,并且它不会对 super 的响应起作用。这通常是一个坏主意。
其次,当你对 validateForDelete 说 NO 时,它会抛出异常,因为删除规则无法完成;在这种情况下级联删除。简而言之,验证方法不是尝试处理这种情况的正确位置。
要处理这种情况,您应该覆盖-prepareForDeletion
A 类中的方法,并让它查看任何适合该情况的 B,并根据需要删除它们。您还需要将删除规则更改为无效而不是级联。我将按如下方式实现它:
- (void) prepareForDeletion
{
[super prepareForDeletion];
if (![self myB]) return; //I don't have a B
if ([[[self myB] myAs] count] > 1) return; //Has more relationships
[[self managedObjectContext] deleteObject:[self myB]];
}
这将检查您是否有 B,如果有,则该 B 是否具有多个关系,如果没有,则将其添加到队列中以进行删除。否则,它将允许 Core Data 取消这种关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)