2012-06-27 2 views
1

Из того, что я читал, для таких отношений, как department <->> employee, я не могу установить правило простого удаления, которое приведет к удалению отдела, если последний сотрудник в отделе удален. Вместо этого я должен закодировать это правило.Правило удаления основных данных для одного-ко-многим

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

я бы не стал ожидать, что отдел предприятие может удалить себя, например:

- (void) didChangeValueForKey:key { 
    if (![key isEqualToString @"employee") return; 
    if (self.employee == NULL) 
     [self deleteAndSave]; // a category method 
} 

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

- (void) didChangeValueForKey:key { 
    if (![key isEqualToString @"employee") return; 
    if (self.employee == NULL) 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"empDelete" object:self]; 
} 

и затем удаление происходят в объект, где я обрабатываю такие вещи, как мой контекст управляемых объектов.

Я пропустил что-то, что сделало бы это проще?

ответ

0

Хорошее место для правил удаления -(void)prepareForDeletion. Вы можете реализовать любое поведение, которое вам нужно, от самых простых до самых сложных.

При удалении отдела вы можете, например, переместить всех сотрудников отдела в родительский отдел, если таковые имеются. И когда вы удаляете сотрудника, вы можете проверить, есть ли у родительского отдела все сотрудники и удалить его, если он оставлен пустым. Ваш звонок.

+0

Я думал об использовании '- (void) prepareForDeletion', но похоже, что это создаст проблему из-за того, что мое правило удаления от отдела к каскаду сотрудника. Удаление объекта отдела здесь приведет к удалению объекта employee каскадным правилом. то мое явное удаление будет ссылаться на объект-сотрудник, который был просто удален. Я не пробовал, но похоже, что это создаст проблему, возможно, ошибку. Я действительно хочу метод, который вызывается после удаления сотрудника, я думаю. Я что-то упускаю? – Jim

+0

Это нормально для ссылки на удаленный управляемый объект. Объект в памяти будет выпущен, когда не будет более сильной ссылки. Фактически, он будет выпущен после того, как строка базы данных будет удалена во всех случаях. isDeleted не работает во всех случаях. Кроме того, вы можете проверить, есть ли у объекта контекст и идентификатор объекта. Также, prepareForDeletion вызывается, когда объект должен быть удален из хранилища, а не при вызове '[context deleteObject:]'. Вероятно, объект был помечен как удаленный ранее. –

+0

Хорошо, я попробую сегодня вечером. Из документации, похоже, мне не нужно называть [super prepareForDeletion]. Вы знаете что-нибудь об этом, что я должен знать? – Jim

Смежные вопросы