Comment supprimer tous les objets à travers une base de données de la relation?

Dire que j'ai personnalisé NSManagedObject Department, ce qui a une propriété représentant une à plusieurs relations aux employés, c'est à dire NSSet *employees;.

Pour un Département donné, je veux supprimer tous objets chez les employés. Qu'est-ce que le recommandé/meilleure façon de le faire, s'il vous plaît?

Donc, hypothétiquement, mon code ressemble à ceci:

Département.h

@interface Department: NSManagedObject {
}
@property (retain) NSString *departmentName;
@property (retain) NSSet *employees;
@end

Département.m

@implementation Department
@dynamic departmentName;
@dynamic employees;

Employé.h

@interface Employee: NSManagedObject {
}
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
@property (retain) Department *worksIn;
@end

doCoreDataStuff

- (void)doCoreDataStuff:sender {
//add a department, give it a couple employees, then try to remove those employees
NSEntityDescription *deptEntity = [NSEntityDescription entityForName:@"Department"
inManagedObjectContext:self.managedObjectContext];
Department *dept = [Department alloc] initWithEntity:deptEntity
insertIntoManagedObjectContext:self.managedObjectContext];
NSError *error;
dept.departmentName = @"Accounting";
//save more often than normal to see more easily what causes error
if (![self.managedObjectContext save:&error]) NSLog(@"\nError: %@", [error localizedDescription]);
NSEntityDescription *empEntity = [NSEntityDescription entityForName:@"Employee"
inManagedObjectContext:self.managedObjectContext];
emp.firstName = @"Steve";
emp.lastName = @"Smith";
emp.worksIn = dept;
if (![self.managedObjectContext save:&error]) NSLog(@"\nError: %@", [error localizedDescription]);
emp = [[Employee alloc] initWithEntity:empEntity
insertIntoManagedObjectContext:self.managedObjectContext];
emp.firstName = @"Natasha";
emp.lastName = @"Johnson";
emp.worksIn = dept;
if (![self.managedObjectContext save:&error]) NSLog(@"\nError: %@", [error localizedDescription]);
//all good so far! now will try to delete all employees for this department
dept.employees = [NSSet set];
if (![self.managedObjectContext save:&error]) NSLog(@"\nError: %@", [error localizedDescription]); //"Multiple validation errors occurred."
//this also produces the same error
[[dept mutableSetValueForKey:@"employees"] removeAllObjects];
if (![self.managedObjectContext save:&error]) NSLog(@"\nError: %@", [error localizedDescription]); //"Multiple validation errors occurred."

La relation employees n'est pas une option donc je suppose que la suppression d'employés du ministère qui veut dire que je suis en train de "orphelines" les employés qui consiste à maintenir les salariés dans le persisté modèle sans associé à un département.

Donc, je pense que ma question initiale devrait être reformulée ainsi: quel est le meilleur/est recommandé d'enlever tous les "enfants" des objets d'un "parent" quand les enfants ont un non-facultatif relation avec le parent?

Je soupçonne que la réponse va être "en boucle et supprimer l'employé objets un à un".

Mise à JOUR

Selon une réponse et un lien vers la documentation d'Apple, je devrais être capable de définir la suppression de la règle de la "Cascade" et puis le code comme department.employees = [NSSet set]; fonctionne. Toutefois, cela ne fonctionne pas dans mon projet très simple où j'ai mis la suppression de la règle en conséquence.

Grâce

  • je me demande si vous avez trouvé une solution à ce problème? je vais avoir le même problème.. s'en tenir à votre exemple, j'ai un processus de synchronisation lorsque j'essaie de supprimer tous les employés et par la suite de les créer à partir de zéro (pour ne pas faire mon synchronisation trop compliqué).. mais pour l'instant le seul moyen que j'ai obtenu que le travail a été de supprimer le 'grand nombre de" relation pour les deux parties - itérer employés appelant [managedObjectContext deleteObject:employé] et par la suite faire un [[département mutableSetValueForKey:@"employés"] removeAllObjects]; ce qui semble tout à fait tort, mais fonctionne..
  • Je n'ai jamais eu l'exemple ci-dessus pour travailler. En fin de compte, j'ai réitéré par l'intermédiaire de salariés et de les supprimer, comme dans la réponse ci-dessous, j'ai juste accepté comme réponse
  • Vous ne comprenez pas la documentation. Lorsque vous SUPPRIMEZ le ministère de l'objet, puis la suppression de la règle s'applique à l'employé des objets dans l'ensemble des employés. La transformation de la relation de ne pas supprimer tous les objets.
InformationsquelleAutor stifin | 2011-06-11