代码之家  ›  专栏  ›  技术社区  ›  Felix Lamouroux

核心数据删除规则和多对多关系

  •  11
  • Felix Lamouroux  · 技术社区  · 15 年前

    假设你有部门和员工,每个部门有几个员工,但每个员工也可以是几个部门的一部分。

    因此,员工和部门之间存在着多对多的关系。删除部门时,我希望删除仅属于该部门的所有员工,并为同时也是其他部门成员的所有员工取消与该部门的关系。

    两个方向的级联规则都能做到这一点吗?或者层叠规则是否自动删除一个部门的所有员工,而不考虑其他隶属关系?

    2 回复  |  直到 13 年前
        1
  •  21
  •   Alex    15 年前

    级联规则将自动删除目标处的对象。因此,如果您删除一个部门,那么不管员工所在的部门数是多少,他们都将被删除。

    听起来你想要的行为更加微妙,只删除那些“孤儿”雇员——也就是那些没有部门的雇员。删除部门时,找到这些部门的一个好方法是执行如下操作:

    NSManagedObject *doomedDepartment = // get the department to be deleted
    
    NSSet *employees = [doomedDepartment valueForKey:@"employees"];
    NSSet *orphanedEmployees = [employees filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"departments.@count == 1"]];
    for (NSManagedObject *orphanedEmployee in orphanedEmployees) {
        [managedObjectContext deleteObject:orphanedEmployee];
    }    
    
    [managedObjectContext deleteObject:doomedDepartment];
    
        2
  •  5
  •   Felix Lamouroux    13 年前

    谢谢,亚历克斯。我可能会那样做。 与此同时,我发现了一种不同的方法:

    1.)注册变更通知:

        [[NSNotificationCenter defaultCenter] addObserver:self 
                selector:@selector(managedObjectContextDidChange:) 
                name:NSManagedObjectContextObjectsDidChangeNotification 
                object:managedObjectContext];
    

    2.)当发生变化并且员工得到更新时。我检查该对象是否与部门有0个关系,然后将其删除:

    - (void)managedObjectContextDidChange:(NSNotification *)notification {
        NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
    
    for(NSManagedObject *obj in updatedObjects){        
        // walk through updated objects -> check for employees
        // check if they still contain departments and if not delete them
        if([obj.entity.name isEqualToString:@"Employee"]){
            NSLog(@"Employee changed!");
            if([[(Employee*)obj Departments] count]==0){
                NSLog(@"No more relations -> Delete Employee");
                [managedObjectContext deleteObject:obj];
            }
        }
    }}
    

    这也很有效,但是如果你有几个不同的实体来观察这种行为,那么可能会变得更复杂。