UIManagedDocument миграция модели данных

Я работаю над приложением для iPhone, которое использует подкласс UIManagedDocument и хранит свои документы в iCloud.

Все работало нормально, пока я не изменил свою базовую модель/схему данных (добавив новую версию модели, как это было несколько раз за последние несколько недель). Я добавил новое свойство и изменил тип данных одного из существующих свойств.

Теперь, когда я запускаю свое приложение, мне кажется, что я не могу загрузить свои документы с помощью UIManagedDocument -openWithCompletionHandler:. Я могу создавать новые документы и читать/писать их. Если я верну версию модели данных на 1, я смогу читать существующие документы, но не новые.

Насколько я понимаю, я выполняю только легкие миграции в модель данных, и UIManagedDocument должен справиться с этим правильно?

Любой совет будет принят с благодарностью!


person adamteale    schedule 29.12.2011    source источник


Ответы (2)


В подклассе UIManagedDocument вы можете попробовать переопределить manageObjectModel следующим образом:

- (NSManagedObjectModel *)managedObjectModel
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"<ModelNameHere>" ofType:@"momd"];
    NSURL *momURL = [NSURL fileURLWithPath:path];
    NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

    return managedObjectModel;
}
person Daniel    schedule 30.12.2011

Приведенное ниже основано на моем понимании:

ПРИМЕЧАНИЕ. Я не проверял его для iCloud, но я проверил его для других устройств, и все в порядке.

UIManagedDocument самостоятельно настраивает managedObjectModel и координатор постоянного хранилища

Когда необходимо выполнить миграцию, просто установите UIManagedDocument в persistentStoreOptions

//Note - In this example, managedDocument is a UIManagedDocument property

self.managedDocument.persistentStoreOptions = [NSDictionary dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                                        [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

Ссылка:

person user1046037    schedule 20.11.2012
comment
где эти строки кодов должны быть помещены? Я переживаю аналогичную проблему. Я поместил его после моего self.database = [[UIManagedDocument alloc] initWithFileURL:url]; Но мой перенос не удался. - person acecapades; 30.05.2013
comment
Пожалуйста, проверьте ссылку на документацию Apple, указанную в моем ответе, документация объясняет все необходимые шаги. Я использовал приведенный выше код в файле AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions. - person user1046037; 30.05.2013
comment
@user1046037 Потрясающе! Это сработало для меня и сэкономило мне массу времени. - person dherrin79; 04.04.2014
comment
Это определенно правильный ответ. Приведенное выше трудно понять, и это может привести к тому, что приложение будет использовать разные модели. - person idmean; 25.04.2015