Подтвердить что ты не робот

Я не переносил NSPersistentStore в новую версию, могу ли я восстановить обновление приложения?

Короче говоря, моя схема основных данных была изменена, и мое приложение было отправлено в магазин приложений, что вызвало крах всех пользователей, которые обновили приложение. Авария вызвана отсутствием NSPersistentStore из-за неправильной миграции модели данных.

Я все еще вижу файлы .sqlite и связанные с ними файлы базы данных в каталоге документов, и если я перехожу к старой версии, все работает отлично со всеми данными. Мой вопрос в том, могу ли я оправиться от этого с помощью обновления приложения, как-то перенастроить существующий NSPersistentStore и добавить его в NSPersistentStoreCoordinator?

EDIT: поэтому я фактически не изменил свой xcdatamodel сам, следовательно, "длинный рассказ короткий". Тем не менее, я удалил XMPPFramework из своего проекта, и у меня возникло ощущение, что это могло вызвать проблемы с основными данными.

EDIT:
Я не внес никаких изменений непосредственно в мою модель данных, но я точно указал на эту проблему. Я извлекал мой NSManagedObjectModel с помощью [NSManagedObjectModel mergedModelFromBundles:nil], который объединяет ВСЕ модели данных, присутствующие в комплекте. Это включало все модели данных, которые поставлялись с XMPPFramework, и теперь, когда структура была удалена, NSManagedObjectModel, который передается в [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel], отличается, что приводит к сбою.

Я решил проблему, используя FMDB для извлечения содержимого существующей БД, затем создал новый файл sqlite и указал координатора постоянного хранилища на этот новый файл sqlite. Затем я просто вставлял все существующие данные в новую базу данных, перебирая существующие данные и создавая соответствующие NSManagedObject s. Я также остановил использование mergedModelFromBundles для извлечения моей модели данных и вместо этого использовал initWithContentsOfURL.

4b9b3361

Ответ 1

На самом деле вы могли обновить xcdatamodel после первой версии, и вы не создали новую модель xcdatamodel для второй версии. Так что на втором обновлении он вылетает.

ПРИМЕЧАНИЕ. После выпуска первой версии вам необходимо создать версию xcdatamodel для второй модели.

Для создания второй модельной версии xcdatamodel -
1. Сначала вы должны выбрать Model.xcdatamodeld → Перейти в редактор в меню → Добавить версию модели. Здесь вы должны указать версию модели и в зависимости от того, какую старую модель вы хотите создать.
Теперь все изменения, которые вы хотите внести, следует внести в новую версию модели xcdatamodel.

enter image description here

2. Вы можете видеть на изображении, что я дал новое имя моей новой модели Model2.0, которая основана на моей предыдущей модели.
Новая модель будет работать точно так же, как ваша старая модель. Кроме того, изменения будут внесены в новую модель, которая не повлияет на вашу старую модель. Так что это не будет сбой вашего приложения после обновления.
3. Вы должны выбрать свой новый Model2.0 в качестве рабочей модели по умолчанию. Для этого, пожалуйста, рассмотрите изображение ниже.

enter image description here

4. Здесь вы можете видеть, что есть 2 модели сейчас. Пожалуйста, выберите "Model.xcdatamodeld" в качестве основной модели и откройте "File Inspector" с правой стороны - как показано на изображении выше.

5. С правой стороны находится поле "Версия модели", в котором указана "текущая" модель, выбранная в этом проекте. Пожалуйста, выберите новую модель Model2.0 для вашей обновленной версии. Теперь вы можете бежать, и все будет работать нормально.

ПРИМЕЧАНИЕ: Пожалуйста, убедитесь, что все изменения, которые вы сделаете, вы сделаете в новой модели Model2.0, чтобы она не конфликтовала со старой моделью. Вы должны каждый раз создавать новую модель, если хотите изменить конфигурацию xcdatamodel в обновленной версии приложения.

Ответ 2

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

Вы запрашиваете автоматическую облегченную миграцию, используя словарь параметров, который вы передаете в addPersistentStoreWithType:configuration:URL:options:error: путем установки значений, соответствующих NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption для YES:

NSError *error = nil;
NSURL *storeURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel]
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

BOOL success = [psc addPersistentStoreWithType:NSSQLiteStoreType
                configuration:nil URL:storeURL
                options:options error:&error];
if (!success) {
  // Handle the error.
}