Как удалить все объекты через отношения основных данных?

Скажем, у меня есть собственный NSManagedObject Department , и у него есть свойство, представляющее отношение ко многим сотрудникам, например NSSet * сотрудники; .

Для данного отдела я хочу удалить все объекты сотрудников. Каков рекомендуемый / лучший способ сделать это, пожалуйста?

Итак, гипотетически мой код будет выглядеть так:

Department.h

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

Department.m

@implementation Department
@dynamic departmentName;
@dynamic employees;

Сотрудник.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."

Отношение сотрудников не является необязательным, поэтому я предполагаю, что удаление сотрудников из отдела означает, что я пытаюсь «осиротить» сотрудников, т.е. оставить сотрудников в постоянной модели без ассоциированный отдел.

Итак, я думаю, что мой первоначальный вопрос следует переформулировать так: какой лучший / рекомендуемый способ удалить все «дочерние» объекты «родителя», когда у детей есть необязательные отношения с родителем?

Я подозреваю, что ответ будет «пройти и удалить объекты сотрудников по одному».

ОБНОВЛЕНИЕ

Согласно ответу и ссылке на документацию Apple, я могу установить правило удаления «Каскад», а затем код вида Department.employees = [NSSet set]; будет работать. Однако это не работает в моем очень простом проекте, где я соответствующим образом установил правило удаления.

Спасибо

20
задан Pochi 14 November 2012 в 01:50
поделиться