1

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

我希望能够在Department没有更多Persons 与之关联时删除它(通过删除Person实体或更改Person'sdepartment属性)。现在,我正在尝试使用以下处理程序来执行此操作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
            }
        }
    }
}

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

4

2 回答 2

9

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

如果您确实需要部门在最后一个人离开时立即删除它,请让您的部门实体使用 KVO 观察自己。awakeFromFetch在和中将其注册为自己的“人”属性的观察者awakeFromInsert,并在 中取消注册willTurnIntoFault。当 person 属性发生变化时,检查它是否为空。这是更多的工作,所以只有在第一种方法不适合你的情况下才尝试。

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

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

于 2011-02-13T06:39:08.850 回答
2

在您的Person子类中,覆盖prepareForDeletion. 如果Department只剩下一个person,也删除Department。Apple 的文档甚至建议使用prepareForDeletion作为进行自定义删除传播的最佳场所。

- (void)prepareForDeletion
{
    [super prepareForDeletion];

    if (self.department.persons.count == 1) {
        [self.managedObjectContext deleteObject:self.department];
    }
}
于 2013-02-20T05:04:17.550 回答