Ошибка согласованности Xcode: установка правила удаления без действий является расширенной настройкой

После создания модели данных в Xcode для каждого отношения объектов выдается следующая ошибка:

Consistency Error:
Setting the No Action Delete Rule on [object relationship] is an advanced setting

Что Xcode пытается мне сказать и как мне реагировать?


person Dan    schedule 12.04.2011    source источник


Ответы (2)


Core Data использует обратные отношения и правила удаления, чтобы поддерживать согласованность графа объектов.

Допустим, у вас есть A.foo ‹11> B.bar и вы делаете a.foo = b. Это автоматически (эффективно) выполняет b.bar = a.

Теперь скажем, вы [b delete]. С правилом «аннулировать» эффективно делает b.bar.foo = nil. С "каскадом" это [b.bar delete]. Без действия ничего не происходит; a.foo теперь является «висячей ссылкой на объект Core Data».

На самом деле это не болтающийся указатель; стандартные правила управления памятью означают, что b все еще будет существовать в памяти, пока a указывает на него (пока a не превратится в ошибку), но a.foo навсегда будет ссылаться на удаленный объект, что вызывает исключение при попытке доступа к его свойствам. Я тоже не знаю, что происходит, когда вы сохраняете и повторно загружаете a.

С отношениями «многие ко многим» все становится сложнее. Сведения о реализации: похоже, что отношение "принадлежит" одному из объектов и сохраняется только при сохранении этого объекта (я столкнулся с этой ошибкой при попытке установить отношение между разными MOC: Сохраненный MOC не владел обновленной сущностью, поэтому отношение никогда не сохранялось). Очевидно, что когда вы удаляете оба a и b, связи также должны быть удалены, поэтому предполагается, что связь исчезает, удаляется только одна из них (но вы не знаете, какая именно!).


Вы, вероятно, хотите Nullify или Cascade. Я никогда не использую Cascade, потому что никогда не могу вспомнить, в каком направлении происходит каскадирование.

person tc.    schedule 12.04.2011
comment
+1 За краткое описание. Я бы добавил, что обычно использую Nullify, но Cascade также оказался очень полезным. Если вы используете No Action, вам, вероятно, следует реализовать -prepareForDeletion в ваших подклассах NSManagedObject. - person westsider; 12.04.2011
comment
С точки зрения запоминания того, в каком направлении происходит каскад, полезно думать о сущности, которую вы выбрали в модели данных, как об источнике, а место назначения отношения — как о цели. Когда вы устанавливаете аннулирование или каскадирование, вы указываете действие, которое будет выполнять источник при удалении источника, т. е. выше вы установили аннулирование или удаление для отношения b.bar. В случае обнуления действие состоит в том, чтобы найти обратную связь с целью и установить для нее значение null. Таким образом, обнуление зависит от обратного, существующего на цели, а каскад - нет. - person Colin; 20.09.2011
comment
Эй, предположим, связь один-ко-многим! один из многих не должен аннулировать ОДИН объект! Он действительно может не выполнять никаких действий! Более того, если я поставлю Nullify, я не смогу получить этот объект из базы данных, хотя он там есть! - person Stas; 01.08.2013
comment
@Stas Если вы используете Nullify и удаляете один из множества объектов, он должен удалить его из набора связанных объектов для одного объекта. Плохие вещи произойдут, если он не предпримет никаких действий. - person tc.; 25.08.2013
comment
@tc не имеет значения, что он должен делать, он сводит на нет весь набор, что является катастрофическим. - person Hogdotmac; 04.09.2020

Запретить Если в месте назначения отношения есть хотя бы один объект, исходный объект не может быть удален. Например, если вы хотите удалить отдел, вы должны убедиться, что все сотрудники этого отдела сначала переведены в другое место (или уволены!), иначе отдел не может быть удален.

Обнулить Установить обратную связь для объектов в месте назначения на нулевую. Например, если вы удаляете отдел, установите отдел для всех текущих членов равным нулю. Это имеет смысл только в том случае, если отношение отдела для сотрудника является необязательным или если вы убедитесь, что вы установили новый отдел для каждого из сотрудников перед следующей операцией сохранения.

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

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

person Daniel    schedule 10.07.2011
comment
У меня есть эта проблема, и я понимаю правила так, как вы их описали, но моя проблема такова: если я удаляю работодателя, я не хочу удалять весь отдел. Тогда я должен использовать Deny, я знаю. Но даже если я удалю последнего работодателя в отделе, я все равно не хочу, чтобы отдел удалялся из всего списка отделов. В этом случае... я должен избавиться от этих предупреждений, верно? - person George; 17.10.2012
comment
Какие предупреждения? Используйте Nullify в отношениях сотрудника с отделом. - person Daniel; 17.10.2012
comment
Этот ответ на самом деле не помогает в вопросе, а просто повторяет правила. - person p0lAris; 31.03.2015