我有一个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
}
}
}
}
实体上执行提取。这是我应该做的事情吗?
答案 0 :(得分:9)
最简单的方法:在您的部门实体类中实施willSave
(您为每个实体提供了自己的类,对吗?*),让您的部门自行检查[self isDeleted] == NO
和[[self person] count] == 0
,并删除自己,如果是这样。 (isDeleted
的检查不是可选的,因为在willSave
内更改自身的实体会触发对willSave的另一次调用。NSManagedObject willSave
的文档会有更多信息。)这会将删除推迟到上下文被刷回磁盘,这应该不是一个大问题。
如果您确实需要部门在最后一个人离开时自行删除,请让您的部门实体用KVO观察自己。在awakeFromFetch
和awakeFromInsert
中将其注册为自己的“人”属性的观察者,并在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];
}
}