只有在没有关系的情况下才能正确处理对象的删除?

Gor*_*not 1 cocoa cocoa-touch core-data nsmanagedobject nsmanagedobjectcontext

我有一个Person属于Department一对多关系的实体.

我希望能够删除Department时,有没有更多的Person与它(或者通过缺失的相连的S Person实体,或更改了Persondepartment属性).现在,我正在尝试使用以下处理程序NSManagedObjectContextObjectsDidChangeNotification(目前只是尝试查看删除,并正确删除):

- (void)managedObjectDidChange:(NSNotification *)notification {

    NSSet *updatedObjects = [[notification userInfo] objectForKey:NSDeletedObjectsKey];
    for (NSManagedObject *obj in updatedObjects) {
        if ([obj.entity.name isEqualToString:@"Person"]) {
            NSLog(@"Person Changed");

            NSManagedObject *department = [(Person *)obj department];
            NSLog(@"%i", [[department valueForKey:@"person"] count]);

            if ([[department] valueForKey:@"person"] count] == 0) {
                NSLog(@"Department has no more people associated with it");
                // deletion code
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我删除某个人时,与该部门相关联的人数不会改变.我没有对Department实体进行提取.那是我应该做的吗?

rge*_*rge 9

最简单的方法:实现willSave你部门的实体类(?你给每个实体自己的类,右*),让您的检查部门本身[self isDeleted] == NO[[self person] count] == 0,如果是删除自身.(检查isDeleted不是可选的,因为实体内部更改willSave会触发另一个对willSave的调用.文档NSManagedObject willSave会有更多信息.)这会推迟删除,直到将上下文刷回磁盘,这应该不是一个大问题.

如果您确实需要部门在最后一个人离开时自行删除,请让您的部门实体用KVO观察自己.注册它作为自身的"人"的财产观察员awakeFromFetchawakeFromInsert,并取消注册willTurnIntoFault.当person属性更改时,请将其检查为空.这是更多的工作,所以只有在第一种方式不适合你时才尝试.

最后,请记住Person-> Department关系删除规则需要设置为'nullify'(当Person被删除时,它将从Department的人员中删除),而不是'no action'(当Person被删除时,你负责清理你自己)或'级联'(删除任何人,其部门也被删除!)

(*MOGenerator是一个非常好的帮手维护每个实体类.http://rentzsch.github.com/mogenerator/)