Frage

Angenommen, Sie haben Abteilungen und Mitarbeiter und jede Abteilung mehrere Mitarbeiter, aber jeder Mitarbeiter kann auch Teil mehrerer Abteilungen sein.

So gibt es eine viele-zu-viele-Beziehung zwischen Mitarbeitern und Abteilungen. Wenn eine Abteilung löschen würde Ich mag alle Mitarbeiter löschen, die nur einen Teil dieser Abteilung sind und zunichte machen, die Beziehung für alle Mitarbeiter dieser Abteilung, die auch Mitglied einer anderen Abteilung ist.

Würde eine Kaskade-Regel in beiden Richtungen das tun? Oder wird automatisch eine Kaskade Regel alle Mitarbeiter einer Abteilung löschen, unabhängig von anderen Zugehörigkeiten?

War es hilfreich?

Lösung

Eine Kaskade Regel wird automatisch die Objekte am Ziel löschen. Also, wenn Sie eine Abteilung löschen, werden die Mitarbeiter gelöscht, unabhängig von der Anzahl der Abteilungen, sie sind in.

Es klingt wie das Verhalten, das Sie wollen ein wenig differenzierter ist, nur die „verwaisten“ Mitarbeiter löschen - das heißt jene, die eine Abteilung nicht haben. Wenn Sie eine Abteilung löschen, ein guter Weg, um diejenigen zu finden wäre, so etwas zu tun:

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

Andere Tipps

Danke, alex. Ich werde das wahrscheinlich tun. In der Zwischenzeit hatte ich eine andere Art und Weise, dies zu tun gefunden:

1) registrieren Sie sich für Benachrichtigungen über Änderungen.

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

2.), Wenn Änderungen auftreten und Mitarbeiter aktualisiert werden. Ich überprüfe, ob das Objekt 0 Beziehungen zu Abteilungen und löschen:

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

, die gut funktioniert auch, aber vielleicht komplizierter, wenn man für die mehrere verschiedene Entitäten haben diese Art von Verhalten zu beobachten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top