2010-11-13 2 views
7

Everytime добавить новый атрибут к моей объектной модели CodeData я должен очистить файл моей базы данных из противном случае я получаю следующее сообщение об ошибке:Почему сбой CoreData при добавлении атрибута?

2010-11-13 15:26:44.580 MyApp[67066:207] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'myApp''

Там должен быть способ быть в состоянии добавить дополнительные поля, не теряя целая база данных.

Что мне нужно сделать, чтобы сохранить мои данные?

ответ

14

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

Для кода вы должны добавить два варианта метода, в котором вы инициализируете своего постоянного координатора хранилища. что-то вроде этого:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator_ != nil) { 
     return persistentStoreCoordinator_; 
    } 
    NSString *storePath = [AppDelegate_Shared coredataDatabasePath]; 
    NSURL *storeURL = [NSURL fileURLWithPath:storePath]; 

// important part starts here 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
          nil]; 
    NSError *error = nil; 
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 
// and ends here 

     LogError(@"Unresolved error %@, %@", error, [error userInfo]); 
     // Do something 
    }  
    return persistentStoreCoordinator_; 
} 

Теперь, если вы хотите изменить свою модель, вам необходимо создать версию модели перед внесением любых изменений.
Выберите свой датамодель и войдите в главное меню Design -> Data Model -> Add Model Version. Ваша «старая» модель будет переименована, и вы внесете изменения в текущую модель, с зеленой меткой.
Все старые модели хранятся и будут помещены в ваше приложение, поэтому ваше приложение может выполнять «автоматическую легкую миграцию» и обновлять существующую базу данных до новой модели.

+0

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

+0

Да, я могу подтвердить, что это работает. Я добавил еще одно поле, и моя база данных все еще работает. Благодарю. – iphaaw

+0

Вы знаете, как вернуть это действие (добавив версию модели)? –

Смежные вопросы