2012-01-30 3 views
2

Я выпустил приложение с базой данных sqlite Core Data. В новой версии моего приложения я создал новую «модельную версию» моего xcdatamodel в XCode. В новой версии объект удаляется, и некоторые новые атрибуты добавляются к одному из объектов.Основные данные: как обрабатывать новые версии?

При обновлении до новой версии приложения, я получаю эту ошибку SQL:

The model used to open the store is incompatible with the one used to create the store

Как я могу справиться с этой ошибкой? Все данные в базе данных загружаются из Интернета, поэтому, возможно, самый простой способ - просто удалить текущий SQL-файл при возникновении этой ошибки и начать с нуля - но что делают люди, когда база данных содержит данные, которые невозможно восстановить?

РЕШЕНИЕ:

Я создал модель отображения в Xcode и изменил мою persistentStoreCoordinator поглотитель для обработки словаря варианта для метода addPersistentStoreWithType:configuration:URL:options:error: с ключом NSMigratePersistentStoresAutomaticallyOption.

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

    NSURL *cacheURL = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject]; 
    NSURL *storeURL = [cacheURL URLByAppendingPathComponent:@"MyDatabase.sqlite"]; 
    NSString *storePath = [storeURL path]; 

    NSError *error = nil; 
    NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption]; 
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
    {   
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return __persistentStoreCoordinator; 
} 

ответ

3

Проблема, с которой вы сталкиваетесь, заключается в том, что вам необходимо перенести данные из старых файлов основных данных в новые файлы данных ядра. Вот почему вы получаете «несовместимую» ошибку в своем вопросе. Если вы измените свою базовую модель данных, вам нужно будет предоставить старую версию и новую версию и сообщить системе, как перенести данные из старой версии в новую.

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

Лучшее, что нужно сделать, - это поиск версий данных с ключевыми данными в Google. Быстрый поиск приводит к довольно полному учебнику http://www.timisted.net/blog/archive/core-data-migration/. Это выглядит неплохо.

+0

Документация Apple о миграции также хорошо стоит прочитать - http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html. К сожалению, исходный вопрос звучит так, будто он выходит за рамки облегченного преобразования, которое Core Data может определить для себя, но материал модели сопоставления вполне уместен, даже если скриншоты не совсем актуальны. – Tommy

+0

Абсолютно. :) Я предпочитаю хорошо написанные учебники для документации Apple, однако, как отправную точку, это правильное место! :) –

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