Подтвердить что ты не робот

Основные данные: обратная связь для двух отношений с одним и тем же типом

Привет В моей базовой модели данных ядра у меня есть объекты Sheet и Text. У объекта листа может быть два текста: privacyNotes и termsOfUse. Оба типа текста. Поэтому в моделировании данных XCode я создаю отношения "один-один", называемые "privacyNotes" и "termsOfUse" в приложении "Лист с текстом". Далее идет одно отношение "лист" в тексте. Затем я выбираю отношение Text.sheet как обратное для Sheet.privacyNotes. Все идет нормально. Но когда я устанавливаю одинаковые отношения Text.sheet как обратные для Sheet.termOfUse, XCode удаляет это отношение как обратное Sheet.privacyNotes! Я понимаю, что отношения в БД могут быть не столь простыми по сравнению с отношениями Objective-C объектов, но я действительно не понимаю, почему SQLite или (CoreData) не могут повторно использовать одно отношение как обратное для FEW других отношений?

4b9b3361

Ответ 1

Маленький заглянуть под капот абстракции может быть просветляющим *: отношение может быть только обратным для одного другого отношения, потому что в хранилище резервных копий они представлены одними и теми же данными. Если текст и листы могут иметь определенную взаимосвязь, Core Data делает то, что сделает хороший человеческий модельер данных, и сохраняет эти отношения как можно более лаконично. Свойства отношения объектов сущности - это просто способы взглянуть на эти отношения.

Чтобы получить эффект от того, что вы собираетесь делать: перейдите и дайте свойства Sheet для privacyNote и termsOfUse; но дайте свойства Text, такие как sheetIAmTermsFor и sheetIAmPrivacyNoteFor, и установите их как обратные. Затем в классе Text добавьте синтетическое свойство в этих строках:

// in interface
@property (nonatomic, readonly) Sheet *sheet;
// in impl
-(Sheet *)sheet
{
  if ([self sheetIAmTermsFor])
    return [self sheetIAmTermsFor];
  else
    return [self sheetIAmPrivacyNoteFor];
}

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

Если вам нужно принудительно установить ограничение на то, что текст может быть только когда-либо "privacyNote" или "термины", но никогда и не обойдется, переопределите сеттеры для sheetIAmTermsFor и sheetIAmPrivacyNoteFor, следуя шаблону Apple в документах и ​​каждый другое свойство при установке.

(* Apple рассматривает базы данных SQLite. Основные данные генерируются как конфиденциальные для их реализации, но проверка их схем может быть очень учебной. Не стесняйтесь писать код доставки, который стоит за CD, чтобы напрямую соваться с db. )

Ответ 2

Вам намного лучше иметь отношения между Листом и текстом от одного до многих, с лимитом проверки на 2. Тогда в тексте должно быть свойство типа, которое объявляет его как либо privacyNotes, либо termsOfUse. Оттуда вы можете добавить удобные методы в ваш подкласс Sheet, который позволяет вам получить один из них.