Core data 一对多核心数据删除规则
根据我所阅读的内容,对于像Core data 一对多核心数据删除规则,core-data,Core Data,根据我所阅读的内容,对于像department>employee这样的关系,我无法设置一个简单的删除规则,如果删除了部门中的最后一名员工,就会导致删除部门。相反,我必须编写这个规则 我想我可以用部门实体的didChangeValueForKey:方法来观察键值。我想以一种干燥的方式将这个删除操作集中到一个地方 我不希望部门实体可以删除自己,就像这样: - (void) didChangeValueForKey:key { if (![key isEqualToString @"emplo
department>employee
这样的关系,我无法设置一个简单的删除规则,如果删除了部门中的最后一名员工,就会导致删除部门。相反,我必须编写这个规则
我想我可以用部门实体的didChangeValueForKey:
方法来观察键值。我想以一种干燥的方式将这个删除操作集中到一个地方
我不希望部门实体可以删除自己,就像这样:
- (void) didChangeValueForKey:key {
if (![key isEqualToString @"employee") return;
if (self.employee == NULL)
[self deleteAndSave]; // a category method
}
所以我可能会发布一个通知
- (void) didChangeValueForKey:key {
if (![key isEqualToString @"employee") return;
if (self.employee == NULL)
[[NSNotificationCenter defaultCenter] postNotificationName:@"empDelete" object:self];
}
然后在我处理托管对象上下文之类的事情的对象中进行删除
我是否遗漏了一些可以让这更简单的方法?您的解决方案似乎很好,下面是一些其他可能的方法。
您的解决方案似乎很好,下面是一些其他可能的方法。
删除规则的好地方是
-(void)preparefordelection
。您可以实现所需的任何行为,从最简单到最复杂
删除部门时,例如,您可以将该部门的所有员工移动到父部门(如果有)。删除员工时,可以检查上级部门是否仍有员工,如果为空则删除。您的呼叫。删除规则的好地方是
-(void)preparefordelection
。您可以实现所需的任何行为,从最简单到最复杂
删除部门时,例如,您可以将该部门的所有员工移动到父部门(如果有)。删除员工时,可以检查上级部门是否仍有员工,如果为空则删除。您的呼叫。我曾考虑使用
-(void)prepareForDeletion
,但这似乎会产生问题,因为我的从部门到员工的删除规则是级联的。在此处删除部门实体将根据级联规则删除员工实体。然后,我的显式删除将引用刚刚删除的雇员实体。我还没有试过,但这看起来会产生问题,可能是个错误。我想,我真的需要一个在删除员工后调用的方法。我遗漏了什么吗?引用已删除的托管对象是可以的。当不再存在强引用时,内存中的对象将被释放。事实上,在所有情况下,它都将在数据库行被删除后发布。isDeleted并非在所有情况下都有效。此外,您可能需要检查对象是否仍然具有上下文和objectID。此外,当对象将要从存储中删除时,而不是在调用[context deleteObject::
时,会调用prepareForDeleteion。该对象可能在不久前被标记为已删除。好的,今晚我将尝试一下。从文档来看,我似乎不需要调用[super preparefordelection]。关于这一点,您知道我应该知道的吗?preparefordelection
default实现什么都不做。如果使用实体的层次结构,则可以调用super,也可以不调用super,具体取决于实体的行为。这对于我认为的每个应用程序都非常具体。我曾考虑过使用-(void)prepareForDeletion
,但这似乎会产生问题,因为我的从部门到员工的删除规则是级联的。在此处删除部门实体将根据级联规则删除员工实体。然后,我的显式删除将引用刚刚删除的雇员实体。我还没有试过,但这看起来会产生问题,可能是个错误。我想,我真的需要一个在删除员工后调用的方法。我遗漏了什么吗?引用已删除的托管对象是可以的。当不再存在强引用时,内存中的对象将被释放。事实上,在所有情况下,它都将在数据库行被删除后发布。isDeleted并非在所有情况下都有效。此外,您可能需要检查对象是否仍然具有上下文和objectID。此外,当对象将要从存储中删除时,而不是在调用[context deleteObject::
时,会调用prepareForDeleteion。该对象可能在不久前被标记为已删除。好的,今晚我将尝试一下。从文档来看,我似乎不需要调用[super preparefordelection]。关于这一点,您知道我应该知道的吗?preparefordelection
default实现什么都不做。如果使用实体的层次结构,则可以调用super,也可以不调用super,具体取决于实体的行为。这是非常具体的每一个应用程序,我认为。