Regole di eliminazione dei dati principali e relazioni molti-a-molti
-
06-07-2019 - |
Domanda
Supponi di avere dipartimenti e dipendenti e che ogni dipartimento abbia diversi dipendenti, ma ogni dipendente può anche far parte di più dipartimenti.
Quindi esiste una relazione molti-a-molti tra dipendenti e dipartimenti. Quando si elimina un reparto, desidero eliminare tutti i dipendenti che fanno solo parte di quel reparto e annullare la relazione con questo dipartimento per tutti i dipendenti che sono anche membri di un altro dipartimento.
Una regola a cascata in entrambe le direzioni lo farebbe? Oppure una regola a cascata elimina automaticamente tutti i dipendenti di un dipartimento indipendentemente da altre affiliazioni?
Soluzione
Una regola a cascata eliminerà automaticamente gli oggetti nella destinazione. Pertanto, se si elimina un dipartimento, i dipendenti verranno eliminati indipendentemente dal numero di dipartimenti in cui si trovano.
Sembra che il comportamento che desideri sia un po 'più sfumato, per eliminare solo il " orfano " impiegati - cioè quelli che non hanno un dipartimento. Quando elimini un dipartimento, un buon modo per trovarli sarebbe fare qualcosa del genere:
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];
Altri suggerimenti
Grazie, alex. Probabilmente lo farò. Nel frattempo avevo trovato un modo diverso di farlo:
1.) registrati per le notifiche sulle modifiche:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(managedObjectContextDidChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:managedObjectContext];
2.) quando si verificano cambiamenti e un dipendente viene aggiornato. Controllo se quell'oggetto ha 0 relazioni con i dipartimenti e lo cancello:
- (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];
}
}
}}
Anche questo funziona bene, ma potrebbe diventare più complicato se si hanno diverse entità per le quali osservare questo tipo di comportamento.