Определение наличия новых версий в базовой модели данных

Короткий вопрос:

Я хочу запустить определенный код в своем приложении, только если изменилась моя модель Core Data (новые объекты, новые свойства и т. Д.). Как определить, изменилась ли модель или нет?

Просто какой-то псевдокод:

if (current_model_version != previous_model_version) { //do some code } else { // do some other code } 

Я предполагаю, что могу использовать versionHashes для этого, или isConfiguration: compatibleWithStoreMetadata :, но я не уверен, как это сделать.

Некоторое редактирование для ясности: «текущий», как в «сейчас» и «предыдущий», как в «последнем приложении времени».

    Ответ, кажется, isConfiguration: compatibleWithStoreMedia:.

    Я нашел полезную информацию здесь:

    http://mipostel.com/index.php/home/70-core-data-migration-standard-migration-part-2

    Я настроил это так:

     - (BOOL)modelChanged { NSError *error; NSURL * sourceURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"db.sqlite"]; NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:sourceURL error:&error]; BOOL isCompatible = [[self managedObjectModel] isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata]; return isCompatible; } 

    «Я» – это мой общий хранилище данных, а не то, что он обязательно должен туда идти.

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

    Это код замены для - (NSPersistentStoreCoordinator *)persistentStoreCoordinator который вы получаете, если пометить поле «Основные данные» при настройке нового проекта в XCode.

    Он пытается открыть существующий файл sqlite (при необходимости, используя легкую миграцию). Если это не удается, оно удаляет и повторно создает хранилище.

     - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; NSError *error = nil; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.storeURL options:options error:&error]) { NSLog(@"Couldn't open the store. error %@, %@", error, [error userInfo]); [self deleteSqliteFilesForStore:self.storeURL]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.storeURL options:options error:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); // or [NSException raise ...] } else { NSLog(@"Store deleted and recreated"); // TEST DATA RE-INITIALIZATION CODE GOES HERE } } else { NSLog(@"Existing Store opened successfully"); } return _persistentStoreCoordinator; } - (void)deleteSqliteFilesForStore:(NSURL *)storeURL { NSURL *baseURL = [storeURL URLByDeletingPathExtension]; // Delete the associated files as well as the sqlite file for (NSString *pathExtension in @[@"sqlite",@"sqlite-shm",@"sqlite-wal"]) { NSURL *componentURL = [baseURL URLByAppendingPathExtension:pathExtension]; BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:[componentURL path]]; if(fileExists) { [[NSFileManager defaultManager] removeItemAtPath:[componentURL path] error:nil]; } } } 
    Давайте будем гением компьютера.