Всем привет! Одна из самых критичных задач в 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 - мощный инструмент, который избавляет разработчиков от ручного написания сложных скриптов миграции. При правильном использовании (создание новых версий модели, а не изменение существующих) система надежно перенесет данные пользователей между версиями приложения.
➡️ Подписаться на канал
Мобильный трудоголик