Каковы критерии совместимости метаданных хранилища и управляемой объектной модели?

В моем приложении используется платформа CoreData, и я хочу проверить совместимость между метаданными хранилища и управляемой объектной моделью. Делаю стандартно:

BOOL isModelCompatible = [model isConfiguration:nil
                    compatibleWithStoreMetadata:metadata];

и он возвращает NO. Однако объекты в метаданных такие же, как и в модели. Одно и то же количество сущностей, и каждая сущность имеет одно и то же имя. Однако модель действительно изменилась с тех пор, как магазин был создан с использованием этой модели, я удалил пару атрибутов в одной сущности. И мне интересно, достаточно ли этого, чтобы модель стала несовместимой с метаданными магазина. Я заглянул в официальную документацию, и там написано:

This method compares the version information in the store metadata with the entity versions of a given configuration

И проблема (как это часто бывает, когда я читаю документы Apple) в том, что я не совсем уверен, что именно означает эта фраза. Так может ли кто-нибудь объяснить больше по этой теме? Как CoreData решает, совместима ли модель с метаданными, если объекты в метаданных такие же, как и в модели?


person Andrey Chernukha    schedule 18.03.2016    source источник


Ответы (1)


Модель несовместима с постоянным хранилищем всякий раз, когда есть разница, влияющая на то, как данные хранятся в файле данных. Удаление атрибутов подходит, поскольку это изменение повлияет на то, как данные сохраняются в SQLite. Некоторые изменения не приводят к несовместимости, например, если вы изменили отношение с необязательного на обязательное, потому что в любом случае файл данных будет одинаковым.

Если вы хотите получить точную информацию, посмотрите на свойство versionHash класса NSEntityDescription и связанных с ним классов. Это точно скажет вам, что используется, и все, что не упомянуто, не влияет на совместимость. Например, на NSEntityDescription он включает

Значения, влияющие на постоянство, следующие: имя сущности, хэш версии суперсущности (если она присутствует), если сущность является абстрактной, и все хэши версий для свойств.

Чтобы продолжить оттуда, найдите то же свойство в NSPropertyDescription и его подклассах.

Миграция модели Core Data устраняет несовместимость, обновляя постоянное хранилище, чтобы оно соответствовало новой модели данных. Часто это можно сделать автоматически, например упрощенная миграция. Удаление атрибутов позволит упростить миграцию.

person Tom Harrington    schedule 18.03.2016