Правильно ли обрабатывать удаление объекта, только если нет связей? - PullRequest
1 голос
/ 13 февраля 2011

У меня есть объект Person, который принадлежит Department в отношениях один ко многим.

Я хотел бы иметь возможность удалить Department, когда больше нет Personсвязанные с ним (либо путем удаления объекта Person, либо путем изменения атрибута Person * department).Прямо сейчас я пытаюсь сделать это с помощью следующего обработчика для NSManagedObjectContextObjectsDidChangeNotification (в настоящее время просто пытаюсь увидеть удаления и удалить их соответствующим образом):

- (void)managedObjectDidChange:(NSNotification *)notification {

    NSSet *updatedObjects = [[notification userInfo] objectForKey:NSDeletedObjectsKey];
    for (NSManagedObject *obj in updatedObjects) {
        if ([obj.entity.name isEqualToString:@"Person"]) {
            NSLog(@"Person Changed");

            NSManagedObject *department = [(Person *)obj department];
            NSLog(@"%i", [[department valueForKey:@"person"] count]);

            if ([[department] valueForKey:@"person"] count] == 0) {
                NSLog(@"Department has no more people associated with it");
                // deletion code
            }
        }
    }
}

Однако подсчет количества связанных людейс отделом не меняется, когда я удаляю человека.Я не выполняю выборку для объекта Department.Это то, что я должен делать?

Ответы [ 2 ]

9 голосов
/ 13 февраля 2011

Самый простой способ: внедрить willSave в свой класс сущностей Департамента (вы даете каждой сущности свой собственный класс, верно? *), Пусть ваш отдел проверит себя на наличие [self isDeleted] == NO и [[self person] count] == 0 и удалит себя, если это так. (Проверка isDeleted не является обязательной, поскольку объект, изменяющий себя внутри willSave, запускает другой вызов willSave. Документы для NSManagedObject willSave содержат дополнительную информацию.) Это откладывает удаление до тех пор, пока контекст не будет сброшен на диск. , которая не должна быть огромной проблемой.

Если вам нужно, чтобы Департамент удалил себя в тот момент, когда последний человек покинул его, попросите ваше подразделение Департамента наблюдать за собой с KVO. Зарегистрируйте его в качестве наблюдателя на собственное свойство person в awakeFromFetch и awakeFromInsert и отмените регистрацию в willTurnIntoFault. Когда свойство person изменяется, проверьте его на пустое. Это больше работы, поэтому попробуйте только если первый способ не работает для вас.

Наконец, помните, что для правила удаления отношений между сотрудником и отделом необходимо установить значение «обнулять» (при удалении сотрудника оно удаляется из сотрудников отдела), а не «никаких действий» (при удалении сотрудника вы принимаете ответственность за самоочищение Отдела) или «каскад» (когда удаляется любое Лицо, удаляется и его Отдел!)

(* MOGenerator - очень хороший помощник для поддержки классов для каждой сущности. http://rentzsch.github.com/mogenerator/)

2 голосов
/ 20 февраля 2013

В вашем подклассе Person переопределите prepareForDeletion.Если у Department есть только один person, удалите также Department.Документация Apple даже предлагает использовать prepareForDeletion как лучшее место для пользовательского распространения при удалении.

- (void)prepareForDeletion
{
    [super prepareForDeletion];

    if (self.department.persons.count == 1) {
        [self.managedObjectContext deleteObject:self.department];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...