Ошибка после добавления новой версии модели данных ядра - PullRequest
2 голосов
/ 07 апреля 2011

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

"Версия модели управляемого объекта, используемая для открытия постоянного хранилища, несовместима с той, которая использовалась для создания постоянного хранилища."

enter image description here

Полагаю, проблема в том, что текущим постоянным хранилищем является старая версия модели. Есть ли способ просто удалить его, чтобы он сделал новый? Меня не волнует сохранение каких-либо этих данных.

Ответы [ 3 ]

7 голосов
/ 07 апреля 2011

Вы должны мигрировать между версиями. Согласно документации Apple, если изменения просты, вы можете сделать легкую миграцию.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweight.html#//apple_ref/doc/uid/TP40008426-SW1

Добавление этих параметров в NSPersistentStoreCoordinator, похоже, работает.

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

    NSURL *url = [applicationFilesDirectory URLByAppendingPathComponent:@"YOURAPP.storedata"];
        persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
        if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:options error:&error]) {
            [[NSApplication sharedApplication] presentError:error];
            [persistentStoreCoordinator release], persistentStoreCoordinator = nil;
            return nil;
        }

    return persistentStoreCoordinator;
4 голосов
/ 08 сентября 2011

В ответ на ваш вопрос: «Есть ли способ удалить его, чтобы он просто создал новый?»

Да.

Просто измените метод получения persistentStoreCoordinator в делегате приложения какследует:

- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {
  if (persistentStoreCoordinator) return persistentStoreCoordinator;
  NSManagedObjectModel *mom = [self managedObjectModel];
  if (!mom) {
    NSAssert(NO, @"Managed object model is nil");
    NSLog(@"%@:%s No model to generate a store from", [self class], (char *)_cmd);
    return nil;
  }
  NSFileManager *fileManager = [NSFileManager defaultManager];
  NSString *applicationSupportDirectory = [self applicationSupportDirectory];
  NSError *error = nil;
  if ( ![fileManager fileExistsAtPath:applicationSupportDirectory isDirectory:NULL] ) {
    if (![fileManager createDirectoryAtPath:applicationSupportDirectory withIntermediateDirectories:NO attributes:nil error:&error]) {
      NSAssert(NO, ([NSString stringWithFormat:@"Failed to create App Support directory %@ : %@", applicationSupportDirectory,error]));
      NSLog(@"Error creating application support directory at %@ : %@",applicationSupportDirectory,error);
      return nil;
    }
  }
  NSURL *url = [NSURL fileURLWithPath: [applicationSupportDirectory stringByAppendingPathComponent: @"storedata"]];
  persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: mom];
  if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType 
                                                configuration:nil 
                                                          URL:url 
                                                      options:nil 
                                                        error:&error]){
    // EDIT: if error opening persistent store, remove it and create a new one
    if([[error domain] isEqualToString:@"NSCocoaErrorDomain"] && [error code] == 134100) {
      NSLog(@"Core Data model was updated.  Deleting old persistent store.");
      [[NSFileManager defaultManager] removeItemAtURL:url error:nil];
      if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType 
                                                configuration:nil 
                                                          URL:url 
                                                      options:nil 
                                                        error:&error]){
        [[NSApplication sharedApplication] presentError:error];
        [persistentStoreCoordinator release], persistentStoreCoordinator = nil;
        return nil;
      }
    } else {
        [[NSApplication sharedApplication] presentError:error];
        [persistentStoreCoordinator release], persistentStoreCoordinator = nil;
        return nil;
    }
    //
  }    
  return persistentStoreCoordinator;
}
0 голосов
/ 07 апреля 2011

Выясните, где ваше приложение хранит документ, и поместите его в корзину.

Но в качестве расширенного комментария вы можете рассмотреть возможности как явной, так и неявной миграции в NSPersistentStoreCoordinator и параметров в.

- (NSPersistentStore *)addPersistentStoreWithType:(NSString *)storeType configuration:(NSString *)configuration URL:(NSURL *)storeURL options:(NSDictionary *)options error:(NSError **)error

В зависимости от того, насколько разные версии вы можете сделать это автоматически, передав NSMigratePersistentStoresAutomaticallyOption & NSInferMappingModelAutomaticallyOption

theres также

- (NSPersistentStore *)migratePersistentStore:(NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error

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