как сделать приложение для iPhone толерантным к изменению схемы CoreData - PullRequest
3 голосов
/ 19 января 2011

У меня есть приложение, которое широко использует API-интерфейсы CoreData. Я разрабатываю обновленную версию, которая добавляет несколько полей к сущности. Мое приложение аварийно завершает работу при загрузке (если только я не выбрасываю частное хранилище и запускаю заново) из-за изменений схемы.

Проблема в том, что когда пользователи переходят на новую версию, я не возражаю против запуска процедуры обновления своих данных при первой загрузке приложения, но я даже не могу загрузить ее, потому что CoreData не нравится схема меняется.

Можно ли как-то сказать CoreData "Все нормально ... не беспокойтесь об изменении схемы"? Потому что я только добавил поля и ничего не переименовал и не удалил.

1 Ответ

6 голосов
/ 19 января 2011

Вы, вероятно, должны получить копию книги основных данных Маркуса Зарры и прочитать о миграции (гл. 5). Но, если это не удастся, есть некоторые основы, которые полезно знать. Во-первых, в обновленном приложении вам нужна как старая модель (схема), так и новая модель. Во-вторых, вам нужно убедиться, что новая модель помечена как «текущая модель». В-третьих, вам нужно убедиться, что вы создаете свой NSPersistentStoreCoordinator таким образом, чтобы он автоматически отображался из существующей модели (загруженной с диска) в новую модель.

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
    {
    if (persistentStoreCoordinator)
        return persistentStoreCoordinator;

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyDataStore.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

    // Use mapping model
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];


    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                configuration:nil
                                URL:storeUrl
                                options:options
                                error:&error])
        {
        [NSApp presentError:error];
        }
    return persistentStoreCoordinator;
    }

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

...