2014-12-18 5 views
0

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

Я нашел несколько подходов (например, Core Data unique attributes):

  1. Чтобы использовать -validateValue:forKey:error:
  2. Чтобы написать какой-то пользовательский метод, чтобы проверить, если значение атрибута уже существует

Какой должен быть наиболее рекомендуемый вариант?

Благодаря

ответ

1

Вы будете нуждаться в какой-то пользовательский код, то ли поставить вас в его validateValue:forKey:error: или пользовательский метод или где-нибудь еще.

Следует ли использовать встроенный метод проверки, это вопрос того, как вы предпочитаете организовывать свой код. Я бы предпочел сделать что-то вроде

  1. Проверьте, уникально ли это значение.
  2. Если это так, вставьте новый экземпляр.

Отчасти потому, что я считаю, что встроенная схема проверки является болью, но в основном это потому, что этот код будет запускаться каждый раз при сохранении изменений в объекте. Если ваш чек находится в validateValue:forKey:error:, вы будете запускать его повторно, даже после того, как вы подтвердите, что значение уникально. Опять же, возможно, вам нужно это сделать, поэтому лучший ответ в вашем случае зависит от более общей картины того, как ваше приложение должно работать.

Простой способ приблизиться к валидации - это сделать выборку с предикатом, идентифицирующим ключ и значение, которое необходимо проверить. Единственное изменение, которое я внес бы в общий выбор, как описано в другом ответе, заключается в том, что я бы использовал countForFetchRequest:error: вместо executeFetchRequest:error:. Это не похоже на то, что вам действительно нужно извлекать существующие объекты во время проверки, вам просто нужно знать, существуют ли какие-либо объекты, поэтому просто проверьте это.

В зависимости от типа уникального атрибута вы можете уменьшить удар производительности, который вы собираетесь предпринять, сделав это. Например, если это строка. Проверка всех существующих строк на матч относительно дорого. С другой стороны, проверка количества существующих целых чисел является дешевой. В этом случае вам может показаться целесообразным добавить числовое свойство к типу вашего объекта, который хранит числовой хеш уникального строкового значения. Используйте хэш только при проверке уникальности. Это будет намного быстрее, чем поиск подходящих строк, и NSString даже имеет удобный метод hash для расчета стоимости для вас.

+0

Спасибо за подробное объяснение – AppsDev

Смежные вопросы