Требования к миграции основных данных

#core-data #core-data-migration

#основные данные #миграция основных данных

Вопрос:

У меня есть пара вопросов о миграции основных данных, на которые я, похоже, не могу найти ответы.

  1. Я вношу небольшое изменение в свой файл модели основных данных … в частности, меняю ‘transformers’ в некоторых преобразуемых атрибутах с пустого на NSSecureUnarchiveFromData (чтобы избавиться от предупреждений о NSKeyedUnarchiveFromDataTransformerName ). Нужно ли мне создавать новую модель и выполнять облегченную миграцию для этого? Или это ни на что не влияет в модели?
  2. С помощью Xcode12.2, если я вношу изменения в свою модель (например, добавляю атрибут или новую сущность), и я не создаю новую версию модели, а просто запускаю приложение… это не сбой! Раньше он всегда выдавал ошибку «Не удается найти модель для исходного хранилища». Что-то изменилось в последнее время? Или я делаю что-то не так?

Спасибо.

Ответ №1:

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

Единственное, что имеет значение для хэшей версий, — это то, что влияет на то, как настроена база данных SQLite. Если изменение чего-либо будет означать изменение схемы SQLite, тогда изменяется хэш версии. Это не включает имя преобразователя. Если вас интересует подробное объяснение, найдите versionHash свойство в NSEntityDescription, NSPropertyDescription, NSAttributeDescription и NSRelationshipDescription

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

Для простых миграций основные данные более щадящие, чем раньше. Облегченная миграция с автоматической генерацией модели сопоставления активна по умолчанию ( shouldMigrateStoreAutomatically и shouldInferMappingModelAutomatically оба по умолчанию являются true). Если вы специально не отключите это, облегченная миграция выполняется только тогда, когда это необходимо. По-прежнему неплохо сохранять разные версии модели, хотя бы для того, чтобы отслеживать, как проект меняется с течением времени, но если вы этого не сделаете, это все равно часто будет работать.

Комментарии:

1. Спасибо. Для миграции я провел некоторое исследование, и «кэширование модели» началось в WWDC2015 для iOS9 / 10.11: developer.apple.com/videos/play/wwdc2015/220