Основные данные: как работать с новыми версиями? - PullRequest
2 голосов
/ 30 января 2012

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

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

Модель, используемая для открытия магазина, несовместима с моделью, используемой для создания магазина

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

РЕШЕНИЕ:

Я создал модель отображения в 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;
}

1 Ответ

3 голосов
/ 30 января 2012

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

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

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

...