[objective-c] Должно ли каждое отношение данных к Core Data иметь обратное?


Answers

Документация Apple имеет прекрасный пример, который предлагает ситуацию, когда у вас могут быть проблемы, не имея обратной связи. Давайте сопоставим его в этом случае.

Предположим, вы смоделировали его следующим образом:

Обратите внимание, что у вас есть одно отношение, называемое « тип », от SocialApp до SocialAppType . Связь не является необязательной и имеет правило удаления «deny» .

Теперь рассмотрим следующее:

SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated

[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
BOOL saved = [managedObjectContext save:&error];

Мы ожидаем, что этот контекст не сработает, поскольку мы установили правило удаления как Deny, а отношение не является необязательным.

Но здесь спасение преуспевает.

Причина в том, что мы не установили обратную связь . Из-за этого экземпляр socialApp не становится помеченным как измененный при удалении appType. Таким образом, для socialApp не требуется проверки, прежде чем сохранять (он не требует проверки, поскольку никаких изменений не произошло). Но на самом деле произошло изменение. Но это не отражается.

Если мы вспомним appType by

SocialAppType *appType = [socialApp socialAppType];

appType - нуль.

Странно, не так ли? Мы получаем nil для необязательного атрибута?

Таким образом, у вас нет проблем, если вы настроили обратную связь. В противном случае вы должны выполнить проверку силы, написав код следующим образом.

SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated

[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];

[socialApp setValue:nil forKey:@"socialAppType"]
BOOL saved = [managedObjectContext save:&error];
Question

Предположим, у меня есть два класса Entity: SocialApp и SocialAppType

В SocialApp меня есть один атрибут: appURL и одно отношение: type .

В SocialAppType меня есть три атрибута: baseURL , name и favicon .

SocialApp type отношений SocialApp - это одна запись в SocialAppType .

Например, для нескольких учетных записей Flickr будет SocialApp записей SocialApp , причем каждая запись содержит ссылку на учетную запись человека. Для типа «Flickr» будет одна запись SocialAppType , на которую SocialApp все записи SocialApp .

Когда я создаю приложение с этой схемой, я получаю предупреждение о том, что нет обратных отношений между SocialAppType и SocialApp .

 /Users/username/Developer/objc/TestApp/TestApp.xcdatamodel:SocialApp.type: warning: SocialApp.type -- relationship does not have an inverse

Нужен ли мне обратный и почему?




Хотя документы, похоже, не требуют обратного, я просто решил сценарий, который фактически привел к «потере данных», не имея обратного. У меня есть объект отчета, который имеет отношение «многие» к отчетным объектам. Без обратной зависимости любые изменения отношения ко многим были потеряны после перезапуска. После проверки отладки основных данных было очевидно, что, хотя я сохранял объект отчета, обновления графиков объектов (отношений) никогда не выполнялись. Я добавил инверсию, хотя я ее не использую, и вуаля, она работает. Поэтому он может не сказать, что это необходимо, но отношения без инверсий могут иметь странные побочные эффекты.




Лучший вопрос: «есть ли причина не иметь обратного»? Основные данные - это действительно структура управления графами объектов, а не система персистентности. Другими словами, его задача - управлять отношениями между объектами в графе объектов. Обратные отношения делают это намного проще. По этой причине Core Data ожидает обратные отношения и написана для этого случая использования. Без них вам придется самостоятельно управлять контурами объектов. В частности, к-многим без обратной связи, очень вероятно, будут повреждены Core Data , если вы работаете очень трудно держать вещи работать. Стоимость с точки зрения размера диска для обратных отношений действительно незначительна по сравнению с выгодой, которую она вам приносит.




Related