2016-12-12 4 views
1

Я не могу добиться простой легкой миграции, просто добавив 1 Entity в datamodel.Основные данные - невозможно достичь простой миграции LightWeight

Я прочитал и следил за всеми руководствами/документацией/сообщениями/ответами, я не могу найти свою ошибку/ошибку.

  • Я создал новую datamodel из уже существующей.
  • Я установил новый datamodel в качестве текущего датамодели.
  • Я добавил только 1 объект в новый datamodel (+ ссылка на родительскую сущность).
  • Я передал варианты словаря NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption по методу addPersistentStoreWithType.

Я даже пытался войти все, спасибо методу данного с этого поста: core data migration

/*! The method checks the Core Data file version is compatible with the App's model version 
and then pushes the main menu view onto the navigation stack. If not compatible it displays a 
message to the user. 

@param file The file URL for the Core Data Store. With UIManagedDocument you have to get the 
actual store file URL, you can't just use the UIManagedDocument file URL. 
*/ 
-(void) checkCoreDataFileVersion:(NSURL*)file 
{ 
    if ([self checkVersion:file]) { 

    // file version is compatible so continue (add code to push the menu view) 

    } else { 

     // file version is NOT compatible 

     _fileOpenErrorAlert = [[UIAlertView alloc] initWithTitle:@"Unable to open Document" message:@"Please check that you have the correct application version installed" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [_fileOpenErrorAlert show]; 

    } 
    return; 
} 


/*! Checks the Core Data files models version against the apps model version to see if they 
are compatible. This will return YES if a lightweight migration can be performed and NO if NOT. 

@param fileURL The file URL for the Core Data Store. With UIManagedDocument you have to get the 
actual store file URL, you can't just use the UIManagedDocument file URL. 
@return Returns YES if they are compatible and NO if not. 
*/ 
- (bool)checkVersion:(NSURL*)fileURL { 

    NSManagedObjectModel *model = [self managedObjectModel]; 

    NSLog(@" app model entity version hashes are %@", [model entityVersionHashesByName]); 

    NSError *error; 
    NSDictionary *metaData = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:fileURL error:&error]; 

    if (!metaData) { 
     NSLog(@"problem getting metaData"); 
     NSLog(@" - error is %@, %@", error, error.userInfo); 
     return NO; 
    } 

    bool result = [model isConfiguration:nil compatibleWithStoreMetadata:metaData]; 
    if (!result) { 
     NSLog(@" file is not compatible!"); 
     NSLog(@" metadata is %@", metaData); 
    } 

    return result; 

} 

Когда я делаю различий метаданных из всех субъектов, я только соответствует разности 1 Entity (вновь созданный). Так почему он не может сделать миграцию? Я просто добавил 1 Entity.

EDIT:

Я не Аварии, приложение работает отлично. Я кое-что не понимаю. Когда я загружаю наше последнее приложение из AppStore, запустите его, и когда я создам из xCode мое последнее приложение разработки (с новой datamodel) поверх одного из AppStore, миграция не происходит.

НО, когда я использую GIT, когда я помещаю HEAD в последнюю версию TAG, создайте, запустите приложение. Затем верните HEAD к моей последней функции разработки (с новой datamodel и т. Д.), Создайте и запустите, миграция завершена и все работает.

Итак, какому сценарию я должен доверять?

+0

Пожалуйста, добавьте описание ошибки/crashlog – Idali

+0

Я отредактировал мой вопрос – Balanced

ответ

0

Да, вы должны доверять второму сенарио, чтобы протестировать миграцию coredata, применив его к последнему выпущенному коду. Первый сенарио недействителен, так как Apple по каким-то причинам соображений дает возможность обновлять загруженное itune приложение с помощью xcode напрямую.

Был способ протестировать обновление на itune-версии, но не напрямую из xcode.

Technical Note TN2285 Testing iOS App Updates

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

Installing Your App on Test Devices Using iTunes

+0

Так почему, когда я использую TestFlight миграция не работает, если у меня есть приложение из AppStore уже установлен на телефоне? Это не реальный сценарий обновления? он работает только с GIT – Balanced

+0

его не то же самое, если у вас установлена ​​версия itune/appStore, чтобы протестировать обновление, необходимое для установки новой версии с помощью itunes ... проверьте Техническую ноту. – Idali

+0

Установка вашего приложения на тестовые устройства с помощью проверки iTunes: https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/TestingYouriOSApp/TestingYouriOSApp.html – Idali