CoreData - сколько сделано для автоматического поддержания отношений - PullRequest
0 голосов
/ 18 ноября 2009

Интересно, я сам слишком много делал и мог бы больше полагаться на CoreData. Предположим, у меня есть два управляемых объекта, Собака и Хвост, которые имеют отношение один к одному. У собаки есть отношения, хвост, это необязательно. Его обратное - владение собакой. Правило удаления из Собаки в Хвост является каскадным. Отношение tailingDog в Tail также необязательно. Его правило удаления равно нулю.

CoreData генерирует как tail, так и owningDog как сохраняющие свойства.

Что мне нужно сделать, чтобы минимально выполнить следующее?

  1. Переместите Хвост Собаки А в Собаку Б
  2. Удалить собаку A (без удаления нового хвоста собаки X).

Я делал что-то вроде этого, полностью написано для ясности

-(void)graftThenKill
{
Tail* tempTail = A.tail;
A.tail = nil; // releases X, sets relationship to nil so we can delete without cascading
B.tail = tempTail; // retains X, sets Tail's owningDog to B
[moc deleteObject:A]; // now we have his tail, don't need A
}

Могу ли я заменить это на

-(void)graft
{
A.tail.owningDog = B; // Makes A's tail nil, safe to delete A without deleting X?
[moc deleteObject:A];
}

1 Ответ

2 голосов
/ 18 ноября 2009

Да, -graft достаточно. Истинная цель Core Data в жизни состоит в том, чтобы поддерживать граф объектов коллекции экземпляров объектов в соответствии с описанием, предоставленным моделью управляемого объекта. Если вы объявляете отношение как один-к-одному, то присвоение (в данном случае) A.tail.owningDog=B приведет к сбросу отношения один-к-одному, при необходимости нарушая предыдущие отношения. Это причина для использования обратных отношений в моделях базовых данных, даже если вы не думаете, что вам нужно пересматривать отношения в обоих направлениях. Обратная связь позволяет Core Data помочь вам, управляя всей связью так, как я описал выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...