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

Почему сущность не может иметь ограничений единственности с одной обязательной обратной связью?

Почему сущность не может иметь ограничений единственности с одним обязательным обратным отношением? Имея два объекта:

  • Person

свойство: name

отношение: отдел (один, не факультативный)

  • Отдел

свойство: title (уникальное ограничение)

отношение: человек (для многих, необязательно)

Модель не будет компилироваться в iOS 9, XCode 7.0.1 с ошибкой неправильно сконфигурированной сущности:

Неконфигурированное сущность: сущность деления не может иметь уникальности ограничений и одного обязательного обратного отношения Person.department

Update: Вопрос по-прежнему имеет значение в XCode 8.3.1.

4b9b3361

Ответ 1

Короткий ответ:

Основная проблема, скорее всего, вызвана стандартом sqlite. Я не уверен в этом. Как бы то ни было, очень вероятно, что это из-за ограничений sqlite. Я нашел несколько сообщений в Интернете, где у людей были проблемы с несколькими ограничениями на одну таблицу, и это, скорее всего, причина, по которой работает обходной стол для двух таблиц.

Длинный ответ:

Это довольно поздно, но я надеюсь, что это все равно поможет.

Это происходит, когда ваш Entity имеет уникальное ограничение и обязательное отношение. Я предполагаю, что это связано с добавлением уникальных ограничений поведения в iOS 9.0. Однако вы можете решить это двумя способами:

Вы удаляете уникальное ограничение или устанавливаете отношение опционально. Вы можете обрабатывать необязательное отношение в коде. Но это не будет хорошим решением.

ИЛИ

Вы можете использовать обходной путь. У вас могут быть оба. Вы можете создать суперкласс с уникальным ограничением. Однако это тоже не будет работать без проблем.

Пусть у вас есть три объекта. A, B и C.

A - ваш суперкласс, а B - подкласс класса A, а C - подкласс класса A. A имеет уникальное ограничение на свойство primaryKey. При сохранении экземпляров B и C вы не можете иметь B и C с одним и тем же primaryKey. Потому что CoreData будет управлять как A.

Вы можете изменить A, чтобы иметь два свойства:

  • int: originalPrimaryKey (нет уникального ограничения)
  • string: primaryKey (уникальное ограничение)

Теперь вы можете сопоставить свои первичныеKeys с оригиналомPrimaryKey, а при установке оригиналаPrimaryKey вы можете установить для свойства primaryKey строки значение CLASS_NAME. {originalPrimaryKey}. Это позволит вам иметь поведение, которого вы ожидаете. Но вы должны добавить обходной путь для primaryKeys.

Ответ 2

Сделайте ваши свойства отношений "необязательными". Это исправило эту проблему в моем случае.