Понимание версий
Существует два отличных представления управления версиями: Ваша перспектива как разработчик и перспектива Базовых Данных. Они могут не всегда быть тем же — рассматривают следующие модели.
Как разработчик, Ваша перспектива обычно, что версия обозначена идентификатором — строка или число, такой как «9A218», «2.0.7», или «Версия 1.1». Для поддержки этого представления модели управляемого объекта имеют ряд идентификаторов (см. versionIdentifiers
) — обычно для единственной модели Вы обеспечиваете единственную строку (сам атрибут является набором так, чтобы, если модели объединяются, все идентификаторы могли быть сохранены). То, как идентификатор должен быть интерпретирован, ваше дело, представляет ли он номер версии приложения, версия, фиксировавшаяся до того, чтобы ехать в отпуск или последнее представление, прежде чем он прекратил работать.
Базовые Данные, с другой стороны, обрабатывают эти идентификаторы просто как «подсказки». Для понимания почему вспомните, что формат персистентного хранилища зависит от модели, используемой для создания его, и что для открытия персистентного хранилища у Вас должна быть модель, которая совместима с этим, раньше создавал его. Рассмотрите тогда, что произошло бы, если бы Вы изменили модель, но не идентификатор — например, если Вы сохранили идентификатор тем же, но удалили один объект и добавили двух других. К Базовым Данным изменение в схеме является значительным, факт, что идентификатор не изменялся, не важен.
Взгляд базовых Данных на управление версиями - то, что оно только интересуется функциями модели та персистентность влияния. Это означает что для двух моделей быть совместимым:
Для каждого объекта следующие атрибуты должны быть равными:
name
,parent
,isAbstract
, иproperties
.className
,userInfo
, и предикаты проверки не сравнены.Для каждого свойства в каждом объекте следующие атрибуты должны быть равными:
name
,isOptional
,isTransient
,isReadOnly
, для атрибутовattributeType
, и для отношенийdestinationEntity
,minCount
,maxCount
,deleteRule
, иinverseRelationship
.userInfo
и предикаты проверки не сравнены.
Заметьте, что Базовые Данные игнорируют любые идентификаторы, которые Вы устанавливаете. В примерах выше, Базовые Данные обрабатывают версию 1.0 (рисунок 1-1) и 1.1 (рисунок 1-2), как являющийся совместимым.
Вместо того, чтобы перечислять через все соответствующие части модели, Базовые Данные создают 32-байтовый обзор хеша компонентов, которые они сравнивают для равенства (см. versionHash
(NSEntityDescription
) и versionHash
(NSPropertyDescription
)). Эти хеши включены в метаданные хранилища так, чтобы Базовые Данные могли быстро определить, могут ли соответствия формата хранилища та из модели управляемого объекта они использовать, чтобы попытаться открыть хранилище. (Когда Вы пытаетесь открыть хранилище с помощью данной модели, Базовые Данные сравнивают хеши версии каждого из объектов в хранилище с теми из объектов в модели, и если все - то же тогда, хранилище открыто.) Обычно нет никакой причины для Вас интересоваться значением хеша.
Могут, однако, быть некоторые ситуации, в которых у Вас есть две версии модели, которую Базовые Данные обычно обрабатывали бы столь же эквивалентный, что Вы хотите быть распознанными как являющийся отличающимся. Например, Вы могли бы изменить имя класса, используемого для представления объекта, или более тонко Вы могли бы сохранить модель тем же, но изменить внутренний формат атрибута, такого как BLOB — это не важно Базовым Данным, но это крайне важно для целостности Ваших данных. Для поддержки этого Базовые Данные позволяют, Вы для установки модификатора хеша для объекта или свойства видите versionHashModifier
(NSEntityDescription
) и versionHashModifier
(NSPropertyDescription
).
В примерах выше, если Вы хотели вынудить Базовые Данные распознать, что «Версия 1.0» (рисунок 1-1) и «Версия 1.1» (рисунок 1-2) Ваших моделей отличается, Вы могли установить модификатор объекта для объекта Рецепта во второй модели для изменения хеша версии, который создают Базовые Данные.