Базовые данные используют обратные отношения и правила удаления, чтобы поддерживать согласованность графа объекта
Допустим, у вас есть 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. Я никогда не использую Каскад, потому что никогда не могу вспомнить, в каком направлении происходит каскад.