Ошибка согласованности XCode: настройка правила удаления без действия ... является расширенной настройкой - PullRequest
18 голосов
/ 12 апреля 2011

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

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

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

Ответы [ 2 ]

43 голосов
/ 12 апреля 2011

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

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

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

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

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


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

13 голосов
/ 11 июля 2011

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

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

...