Большие проблемы после обновления приложения. Ошибка переноса CoreData

сегодня утром у нас была большая проблема с нашим приложением для iphone. Нам даже пришлось взять его из магазина.

Дело в том, что мы внесли небольшие изменения в нашу xcdatamodel. Мы думали, что процесс обновления автоматически заботится о правильном обмене, пока не обнаружили, что существует что-то вроде миграции CoreData.

Мы используем UIManagedDocument для подключения к постоянному хранилищу.

Как можно заменить этот файл на новый? Пока мы разрабатывали, мы просто удалили все приложение с устройства, а затем установили его снова, и все заработало. Как мы можем смоделировать этот процесс в магазине приложений с обновлениями?

ОБНОВИТЬ

Я пытаюсь установить параметр миграции следующим образом

_database = [[UIIManagedDocument alloc] init];
NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption],

_database.persistentStoreOptions = options;

но приложение все равно вылетает

** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Этот NSPersistentStoreCoordinator не имеет постоянных хранилищ. Он не может выполнить операцию сохранения.



person MrBr    schedule 04.09.2012    source источник


Ответы (1)


Ключом к этому является управление несколькими версиями вашего файла xcdatamodel. Одна версия является текущей и используется для открытия хранилищ данных, созданных в соответствии с более ранними версиями. При этом вы используете сопоставление миграции для преобразования одной модели в другую. Все это объясняется здесь .

Что касается ваших вопросов: как вы имитируете процесс обновления, собственно ничего особенного делать не нужно:

  1. установить старую версию;

  2. заполнить его хранилище данных некоторыми данными;

  3. установить через Xcode более новую версию поверх старой;

Более новая версия будет иметь более новую модель данных; при установке поверх старой версии он найдет старое хранилище данных и должен будет попытаться перенести его. Именно это происходит при обновлении через App Store: бинарник приложения заменяется, но данные его песочницы остаются нетронутыми, поэтому новый бинарник найдет его уже там.

Надеюсь это поможет.

РЕДАКТИРОВАТЬ:

Ваш код укорочен, поэтому я не уверен, что вы еще этого не сделали, но вы можете попробовать:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

Также ознакомьтесь с этим сообщением. .

На другой монете автоматическая миграция не всегда будет работать, это зависит от того, какие изменения вы внесли в модель; когда это не работает, вам нужно указать пользовательскую модель миграции. Это очень информативный пост о тема.

person sergio    schedule 04.09.2012