Миграция NSPersistentCloudKitContainer с помощью специального NSEntityMigrationPolicyIOS

Программируем под IOS
Ответить
Anonymous
 Миграция NSPersistentCloudKitContainer с помощью специального NSEntityMigrationPolicy

Сообщение Anonymous »

Недавно я внес значительные изменения в свою схему, и мне нужно перенести модель CoreData + CloudKit в новую версию. Изменения требуют от меня использования пользовательского NSEntityMigrationPolicy, поскольку у меня довольно сложное сопоставление между некоторыми старыми и новыми объектами.
  • Я добавил новая версия модели. Удалены некоторые объекты и добавлены некоторые объекты.
  • Я определил NSEntityMigrationPolicy с помощью createDestinationInstances(forSource:in:manager:) и createRelationships(forDestination:in: менеджер :).
  • Я создал новую базовую модель сопоставления данных. (Возможно, в этом нет необходимости. Если да, то как программно связать мои объекты с политикой миграции?)
  • В рамках базовой модели сопоставления данных я указал пользовательскую политику для всех объектов.
    В настройке контейнера я добавил два параметра, как показано ниже:

Код: Выделить всё

storeDescription.setOption(false as NSNumber, forKey: NSMigratePersistentStoresAutomaticallyOption)

storeDescription.setOption(false as NSNumber, forKey: NSInferMappingModelAutomaticallyOption)
В основном я следовал руководству по миграции основных данных. (Это не конкретно для CloudKit.)
Когда я запускаю свое приложение, я получаю самые основные ошибки:

Версия модели управляемых объектов, использованная для открытия постоянного хранилища, несовместима с той, которая использовалась для создания постоянного хранилища.

Полагаю, что эта миграция даже не предпринималась, что имеет смысл, поскольку я установил для NSMigratePersistentStoresAutomaticallyOption значение false.
Я попытался выйти за рамки того, что смог найти в Интернете, и попытался инициализировать вручную миграция:

Код: Выделить всё

let sourceModel = container.persistentStoreCoordinator.managedObjectModel

guard let modelURL = Bundle.main.url(forResource: "MyModelName", withExtension: "xcdatamodeld") else {
fatalError("Unable to locate model file.")
}

guard let destinationModel = NSManagedObjectModel(contentsOf: modelURL) else {
fatalError("Unable to load destination model.")
}

let migrationManager = NSMigrationManager(sourceModel: sourceModel, destinationModel: destinationModel)

let mappingModel = NSMappingModel(from: [Bundle.main], forSourceModel: sourceModel, destinationModel: destinationModel)!

migrationManager.currentEntityMapping.entityMigrationPolicyClassName = "MyMigrationPolicyClassName"
Тогда я застрял на методеmigrStore(from:type:mapping:to:type:). Кажется, он нацелен только на локальное хранилище, а не на CloudKit. В противном случае, что мне предоставить для URL-адресов и типов?
Мой вопрос: как реализовать собственную логику для CoreData с помощью миграции CloudKit?

Подробнее здесь: https://stackoverflow.com/questions/784 ... tionpolicy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»