gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:49:19 25 4
gpt4 key购买 nike

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

当不再有 Person 与其关联时,我希望能够删除 Department(通过删除 Person code> 实体,或对 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
}
}
}
}

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

最佳答案

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

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

最后,请记住,人员->部门关系删除规则需要设置为“无效”(当人员被删除时,将从部门的人员中删除),而不是“无操作”(当人员被删除时,您采取自己负责清理部门)或“级联”(当任何人被删除时,其部门也会被删除!)

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

关于cocoa - 只有在没有关系的情况下才正确处理对象的删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4982304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com