Как я могу узнать, можно ли удалить объект core-data, если отношения могут этому помешать?

#iphone #ios #core-data

#iPhone #iOS #core-data

Вопрос:

Допустим, у меня есть база данных сотрудников, где сотрудник может быть менеджером отдела. Связь менеджера отдела (с сотрудником в роли менеджера) не является необязательной. Итак, я не могу удалить сотрудника, когда он является менеджером подразделения.

В моем UITableViewDelegate я хотел бы иметь:

 -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView
          editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [self mayDeleteTableView:tableView entryAtIndexPath:indexPath] ?
            UITableViewCellEditingStyleDelete : UITableViewCellEditingStyleNone;
}
  

Где mayDeleteTableView:entryAtIndexPath возвращается NO , когда сотрудник является менеджером отдела, в противном случае YES .

Теперь, конечно, я могу реализовать этот метод, настроив запрос на выборку, который сообщает мне, чего я хочу. Но я просто подумал, есть ли более простой способ, чем этот, потому что core-data должен иметь какой-то механизм, чтобы точно это выяснить, иначе это не могло бы вызвать ошибку, когда я удаляю объект, который я не должен.

Итак, мой вопрос таков: «Предлагает ли core data каким-либо образом реализацию mayDeleteTableView:entryAtIndexPath для меня?»

Обновление: Хорошо, на самом деле я нашел NSManagedObject:validateForDelete метод сейчас. Кажется, что он возвращается всегда NO . Итак, теперь мой вопрос таков: «Должен ли я реализовать validateForDelete или это должно выполнить правильную проверку для меня (в этом случае я делаю что-то еще неправильно)?»

Комментарии:

1. Хорошо, я делаю что-то еще неправильно. На самом деле, использование validateForDelete кажется идеальным.

2. Если validateForDelete: возвращает NO, оно должно сопровождаться соответствующей ошибкой о том, почему. О чем говорится в ошибке?

Ответ №1:

Если вы настроили атрибут manager как BOOL или что-то подобное, вы можете проверить свой TableView на соответствие этому. После получения ссылки на сотрудника через TableView, что-то простое, например

 return [[[fetchController objectAtIndexPath:indexPath] manager] boolValue] ? UITableViewCellEditingStyleNone : UITableViewCellEditingStyleDelete;
  

Здесь я предполагаю, что вы получаете объект core data через NSFetchResultsController, но независимо от того, как вы его собираете, это должна быть та же логика. Я надеюсь, что это поможет

Комментарии:

1. Хорошо, это звучит разумно. Если я установлю для «managesDepartment» в employee отношение, обратное отношению к отношению «менеджер» в отделе, я мог бы просто проверить, является ли это пустым. Спасибо.

2. На самом деле, возможно, было бы лучшей идеей настроить свойство BOOL isManager для каждого сотрудника. Я говорю это только потому, что при сохранении вашего managedObjectContext nil значения имеют тенденцию приводить к сбою системы. Итак, если вы настроили свойство BOOL, у вас всегда будет или YES или NO , поэтому сохранение контекста будет безопасным. Это также должно позволить вам использовать приведенный выше код в моем ответе вместо того, чтобы использовать validateForDelete: метод

3. Что ж, похоже, что validateForDelete не работает. Я обнаружил, что он также не предназначен для этого использования. Смотрите bit.ly/iWmdsq