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

时间:2011-02-13 03:43:02

标签: cocoa cocoa-touch core-data nsmanagedobject nsmanagedobjectcontext

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

我希望能够在没有Department与之关联的情况下删除Person(通过删除Person实体,或者更改Person的{​​{1}}属性)。现在,我正在尝试使用department的以下处理程序(目前只是尝试查看删除,并正确删除):

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 } } } } 实体上执行提取。这是我应该做的事情吗?

2 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:2)

Person子类中,覆盖prepareForDeletion。如果Department只剩下一个person,请删除Department。 Apple的文档甚至建议使用prepareForDeletion作为自定义删除传播的最佳位置。

- (void)prepareForDeletion
{
    [super prepareForDeletion];

    if (self.department.persons.count == 1) {
        [self.managedObjectContext deleteObject:self.department];
    }
}