Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Core data 一对多核心数据删除规则_Core Data - Fatal编程技术网

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,具体取决于实体的行为。这是非常具体的每一个应用程序,我认为。