Core Data Deletion rules and many-to-many relationships

后端 未结 2 1412
感情败类
感情败类 2021-01-02 03:58

Say you have departments and employees and each department has several employees, but each employee can also be part of several departments.

So there is a many-to-ma

相关标签:
2条回答
  • 2021-01-02 04:38

    Thanks, alex. I will probably do that. In the meantime I had found a different way of doing this:

    1.) register for notifications on changes:

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

    2.) when changes occur and an employee gets updated. I check if that object has 0 relations to departments and delete it:

    - (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];
            }
        }
    }}
    

    That works well too, but might get more complicated if you have several different entities for which to observe this kind of behavior.

    0 讨论(0)
  • 2021-01-02 04:45

    A cascade rule will automatically delete the objects at the destination. So, if you delete a department, the employees will be deleted regardless of the number of departments they're in.

    It sounds like the behavior you want is a little more nuanced, to delete only the "orphaned" employees -- i.e. those that don't have a department. When you delete a department, a good way of finding those would be to do something like this:

    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];
    
    0 讨论(0)
提交回复
热议问题