Означают ли несколько версий xcdatamodel, что нам нужно несколько файлов xcmappingmodel? - PullRequest
2 голосов
/ 06 февраля 2012

У меня есть несколько версий файлов xcdatamodel:

app1.0.xcdatamodel
app1.1.xcdatamodel
app1.2.xcdatamodel (current)

Значит ли это, что мне нужно несколько комбинаций файлов xcmappingmodel для всех сценариев обновления?

app1.0_to_app1.1.xcmappingmodel (had this already)
app1.1_to_app1.2.xcmappingmodel (is it iterative?)
app1.0_to_app1.2.xcmappingmodel (too much?)

Спасибо!

Ответы [ 3 ]

4 голосов
/ 07 февраля 2012

Базовые данные требуют, чтобы вы создали модель отображения, чтобы перейти от текущей версии хранилища данных к последней версии хранилища данных. Это означает, что вам нужно будет сделать тот, который идет от v1 -> v2 и v2 -> v3 и v1 -> v3.

Из Руководства по версионированию и миграции основных данных

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

Обратите внимание, что вы должны создать подходящую модель отображения для этот этап, чтобы преуспеть.

Как обсуждено в этом документе Apple Отображение основных данных

1 голос
/ 31 октября 2012

Вы можете реализовать прогрессивную миграцию данных. Ищите прогрессивноMigrateURL здесь http://media.pragprog.com/titles/mzcd/code/ProgressiveMigration/AppDelegate.m

0 голосов
/ 11 января 2013

progresslyMigrateURL - отличный пример, но я не думаю, что он вам действительно нужен, поскольку версии вашего документа появляются, пока вы разрабатываете приложение, поэтому каждый раз, когда вам нужно столько картографических моделей, сколькоколичество поддерживаемых версий модели данных минус одна и не более (например, вам не нужен app1.0_to_app1.1.xcmappingmodel, поскольку версия 1.1 больше не является последней версией).Каждый раз, когда вы создаете новую версию, вам нужно просто исправить целевую модель в каждой имеющейся у вас модели отображения и добавить еще одну, если необходимо, хотя, возможно, вам придется генерировать новые и удалять старые.Дело в том, что миграция за одну стадию (которая не заставляет вас создавать больше картографических моделей по сравнению с прогрессивной) намного быстрее во время выполнения, как вы можете заметить.Вам также не нужно создавать модели сопоставления для тривиальных случаев и использовать упрощенную миграцию (вместо этого используйте Процесс миграции по умолчанию, если в конкретной ситуации требуется модель сопоставления, которая не может быть сгенерирована во время выполнения (конечно, она должна быть в вашем приложении).bundle)) или выполнить миграцию с помощью модели отображения, созданной во время выполнения с помощью inferredMappingModelForSourceModel: destinationModel: error: метод класса NSMappingModel, а затем, при необходимости, настроенного в коде (в этом случае вам потребуется запустить миграцию вручнуюВызов migrateStoreFromURL: type: options: withMappingModel: toDestinationURL: destinationType: destinationOptions: error: метод экземпляра NSMigrationManager, насколько я понимаю).Удачи!

...