2009-10-23 16 views
11

Digamos que tiene departamentos y empleados, y cada departamento tiene varios empleados, pero cada uno de los empleados también pueden ser parte de varios departamentos.reglas Core Eliminación de datos y muchos-a-muchos relación

lo que existe una relación de muchos a muchos entre los empleados y departamentos. Al borrar un departamento quisiera eliminar todos los empleados que son sólo una parte de ese departamento y anulan la relación de este departamento para todos los empleados que también son miembros de otro departamento.

¿Sería una cascada en reglas en ambas direcciones hacer eso? ¿O una regla en cascada elimina automáticamente a todos los empleados de un departamento, independientemente de otras afiliaciones?

Respuesta

21

Una regla cascada eliminará automáticamente los objetos en el destino. Por lo tanto, si elimina un departamento, los empleados serán eliminados independientemente de la cantidad de departamentos en los que estén.

Parece que el comportamiento que desea es un poco más matizado, para eliminar solo a los empleados "huérfanos" - - es decir, aquellos que no tienen un departamento. Cuando elimina un departamento, una buena forma de encontrarlos sería hacer algo como esto:

NSManagedObject *doomedDepartment = // get the department to be deleted 

NSSet *employees = [doomedDepartment valueForKey:@"employees"]; 
NSSet *orphanedEmployees = [employees filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 1"]]; 
for (NSManagedObject *orphanedEmployee in orphanedEmployees) { 
    [managedObjectContext deleteObject:orphanedEmployee]; 
}  

[managedObjectContext deleteObject:doomedDepartment]; 
5

Thanks, alex. Probablemente haga eso. Mientras tanto, yo había encontrado una forma diferente de hacer esto:

1.) registrar las notificaciones de cambios:

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

2.) Cuando se producen cambios y un empleado se actualiza. Me asegurarse de que ese objeto tiene 0 relaciones con los departamentos y eliminarlo:

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

que funciona bien también, pero podría complicarse más si tiene varias entidades diferentes para el que observar este tipo de comportamiento.

+4

Si usted está trabajando en Cocoa Touch o Snow Leopard, puede poner esta lógica en 'método -prepareForDeletion' del departamento. –

+0

Creo que esta es una solución mejor, ¡gracias! – Nick

+0

Cuando dices departamento, ¿te refieres a un departamento de llamadas NSManagedObject? – Ricardo

Cuestiones relacionadas