Добавить объявление

Core Data миграции: Как безопасно менять модель данных

Всем привет! Одна из самых критичных задач в iOS-разработке: изменение структуры базы данных без потери пользовательских данных. Представьте: вы выпускаете обновление приложения, а у пользователей пропадают все сохраненные данные. Это катастрофа! К счастью, Core Data предлагает элегантное решение: легкую миграцию. Сейчас разберем, как это работает.

Что такое легкая миграция и когда она возможна:


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

Что не поддерживается в легкой миграции:


  • Изменение типа существующего атрибута (например, String в Int).

  • Сложные трансформации данных.

  • Изменение иерархии наследования сущностей.

Использование легкой миграции:


Для успешного автоматического обновления модели данных необходимо выполнить три последовательных действия:
  • Активация механизма легкой миграции.

  • Создание новой версии модели данных.

  • Внесение изменений в обновленную модель.

Рассмотрим каждый этап подробно:



Активация механизма миграции:

При использовании современного подхода с NSPersistentContainer дополнительная настройка не требуется, система автоматически включает поддержку легких миграций.

Если же вы работаете с собственной реализацией стека Core Data, потребуется явно указать необходимые опции при подключении хранилища:

let persistentStoreCoordinator = NSPersistentStoreCoordinator(
managedObjectModel: dataModel
)

let migrationOptions: [AnyHashable: Any] = [
NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true
]

do {
try persistentStoreCoordinator.addPersistentStore(
ofType: NSSQLiteStoreType,
configurationName: nil,
at: databaseURL,
options: migrationOptions
)
} catch {
// Обработка неудачной миграции
}

Эти два параметра дают Core Data команду: автоматически определять различия между схемами данных и выполнять преобразования, когда это возможно.


Создание новой версии модели:

Для корректной миграции системе необходимо видеть как исходную, так и целевую версию модели данных.

Важное правило: никогда не редактируйте непосредственно существующий файл .xcdatamodeld после публикации приложения. Вместо этого:

  • В Xcode выберите вашу модель данных.

  • Перейдите в меню Editor -> Add Model Version.

  • Система создаст копию модели с новым именем.

  • В панели File Inspector установите созданную версию как текущую (Current).


Теперь можно безопасно вносить изменения, не затрагивая структуру, с которой работают пользователи текущей версии приложения.


Редактирование обновленной модели:

Вносите изменения исключительно в новую, только что созданную версию модели. Core Data сможет автоматически построить карту преобразований, если изменения соответствуют определенным шаблонам:

  • Добавление или удаление сущностей, их атрибутов или связей.

  • Переименование элементов через указание Renaming Identifier в Data Model inspector.

  • Изменение обязательности атрибутов (с обязательного на необязательный и наоборот) при наличии значения по умолчанию.

  • Изменение типа связи (например, с «один-к-одному» на «один-ко-многим»).

Проверка возможности автоматической миграции:


let canMigrateAutomatically = try? NSMappingModel.inferredMappingModel(
forSourceModel: previousModelVersion,
destinationModel: updatedModelVersion
) != nil

if canMigrateAutomatically {
// Легкая миграция возможна
} else {
// Требуется ручная (тяжелая) миграция
}

Если метод возвращает nil, это означает, что Core Data не может самостоятельно сопоставить версии моделей.

Вывод:


Легкая миграция Core Data - мощный инструмент, который избавляет разработчиков от ручного написания сложных скриптов миграции. При правильном использовании (создание новых версий модели, а не изменение существующих) система надежно перенесет данные пользователей между версиями приложения.
03.12.2025 7 517