Coredata ручная миграция - PullRequest
       4

Coredata ручная миграция

2 голосов
/ 17 сентября 2010

Я использую данные Core в проекте iOS.У меня есть настройка модели данных для автоматической миграции данных всякий раз, когда я изменяю свойства объекта.Но недавно я внес некоторые изменения в некоторые отношения сущностей, и теперь мое приложение вылетает с: «Не могу найти модель для исходного хранилища»

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

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

NSURL *destinationStoreURL = [NSURL fileURLWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"import.sqlite"]];

NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"db.sqlite"]]; 

//initialize migration manager
NSMigrationManager *migrationManager = [[NSMigrationManager alloc] initWithSourceModel:[[self persistentStoreCoordinator] managedObjectModel]
                                                                      destinationModel:[[self persistentStoreCoordinator] managedObjectModel]];

//perform migration     
NSError *error = nil;       
NSMappingModel *mappingModel = [NSMappingModel inferredMappingModelForSourceModel:[[self persistentStoreCoordinator] managedObjectModel]
                                                                 destinationModel:[[self persistentStoreCoordinator] managedObjectModel] error:&error];

if (mappingModel == nil) {
    NSLog(@"No Mapping model error %@, %@", error, [error userInfo]);
}

[migrationManager migrateStoreFromURL:sourceStoreURL
                                 type:NSSQLiteStoreType
                              options:nil
                     withMappingModel:mappingModel
                     toDestinationURL:destinationStoreURL
                      destinationType:NSSQLiteStoreType
                   destinationOptions:nil
                                error:&error];  

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

У кого-нибудь есть идеи?

Ответы [ 4 ]

1 голос
/ 17 сентября 2010

Core Data сначала проверит, совместима ли ваша модель данных с текущим хранилищем данных, но это не будет иметь место, если вы изменили отношения. Сначала необходимо добавить версию модели, что можно сделать из Xcode, выбрав модель данных, а затем выбрав в меню пункт «Дизайн»> «Модель данных»> «Добавить версию модели». Вам также необходимо установить текущую версию модели.

На Apple есть хороший ресурс относительно миграции.

1 голос
/ 30 сентября 2010

Ребята правы ...

Если еще не поздно, попробуйте следующее: Откройте файл «[ваша база данных] .xcdatamodel».Затем (предположим, что вы используете XCode), перейдите в главное меню.Выберите «Дизайн»> «Модель данных»> «Добавить версию модели».Это создает новый файл, в нашем случае «[ваша база данных] 2.xcdatamodel»:

Теперь перейдите в «Дизайн»> «Модель данных»> «Установить текущую версию». Это говорит Xcode, что это схема базы данных, которую вы используете.я буду использовать. Теперь внесите любые изменения схемы базы данных, которые вы хотите. Сейчас, вероятно, самое время внести любые изменения в код, когда изменение схемы базы данных было произведено напрямую.

Теперь скомпилируйте вашу программу. На этот раз она должна загрузить.

Я столкнулся с той же проблемой. Это первый раз, когда я на самом деле читал Документы по разработке для IPhone. Мне нужно было действительно обратить внимание. Теперь у меня все готово. Я фактически выбрал облегченную миграцию. Этот кодбыл похищен прямо из одной (или нескольких) примеров программ Apple (которые часто содержат ошибки, просто чтобы вы знали ...: - /)

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
 if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
 }

 NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
      stringByAppendingPathComponent:DATABASENAME]];
 NSError *error;
 persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:      
  [self managedObjectModel]];

 // Allow inferred migration from the original version of the application.
 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithBool:YES], 
        NSMigratePersistentStoresAutomaticallyOption,
        [NSNumber numberWithBool:YES], 
         NSInferMappingModelAutomaticallyOption, nil];

 //ATTENTION: YOU WERE CRASHING HERE...
 if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
 configuration:nil URL:storeUrl options:options error:&error]) {
       // Handle the error.
      NSLog(@"WTF??? FAILED to create automatic lightweight migration. Error[%@]", error);
 }    
0 голосов
/ 12 февраля 2013

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

Просто переименуйте ваш DATABASE.sqlite так же, как DATABASE.xcdatamodeld и поместите их обоих в то же место, которое находится в каталоге Documents :) удачи

0 голосов
/ 17 сентября 2010

Вы установили текущую версию из меню дизайна? После этого автоматическая миграция должна работать, если для параметров NSMigratePersistentStoresAutomaticsOption и NSInferMappingModelAutomaticsOption задано значение YES.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...