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.
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez supprimer les éléments employés pour un service spécifique, puis vous pouvez exécuter un pour-en boucle comme pour
Puis enregistrez votre contexte de la gestion. SI c'est ce que vous voulez, et de ne pas supprimer la relation entre les employés et le département; dans ce cas, l'attribution d'un ensemble vide serait de travailler.
Variation sur ci-dessus:
theEmployee
à néant, il n'affecte pas l'objet géré du tout.Réglage du ministère de l'employé de la relation à un ensemble vide ne VA PAS supprimer les employés, indépendamment de la règle de suppression. Je crois que vous êtes l'incompréhension de la règle de suppression. Selon l'apple docs:
"Une relation de supprimer la règle spécifie ce qui se passerait si une tentative est faite pour supprimer la source de l'objet".
Ainsi, en cascade ne prendra effet que si nous supprimons le département. Par définition de la relation à un ensemble vide, tout ce que nous faisons est de séparer les employés du ministère, de ne pas les supprimer. Et si cette relation n'est pas définie en option pour les employés, cela va provoquer une erreur lors de l'enregistrement. Si vous souhaitez supprimer les employés du ministère, vous pouvez effectuer une itération à travers eux, comme indiqué ci-dessus, ou l'ensemble du département de la relation à la cascade, puis supprimer le département.
J'ai aussi eu quelque chose comme ci-dessous mais ça ne marchait pas...
}
Évidemment, la couche de base de données ne peut pas supprimer les sons et puis la collection à la fois. Réglage de la suppression de la règle sur la relation de 'cascade' bien résolu mon problème et de me laisser l'utiliser juste:
Si vous voulez économiser de personnes lecture détaillée de temps, puis il suffit de marquer ce que la réponse.
Comme Fervus indiqué ci-dessus, ce lien peut également être utile pour les pros:
Propager supprime immédiatement dans la Base de Données