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