Легкая миграция данных с iPhone: нельзя объединять модели - PullRequest
3 голосов
/ 20 января 2011

Я только начал с основных данных iPhone и столкнулся с проблемой упрощенной миграции.

  • Я добавил два новых поля в мою старую модель
  • Восстановлены файлы классов модели
  • Сделана новая версия модели как текущая версия
  • Добавлен следующий код в AppDelegate в сгенерированный шаблон

    NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool: YES], NSMigratePersistentStoresAutomaticsOption, [NSNumber numberWithBool: YES], NSInferMappingModelAutomaticsOption, nil] * 1013; * 101;

    if (! [PersistentStoreCoordinator_ addPersistentStoreWithType: конфигурация NSSQLiteStoreType: nil URL: параметры storeURL: ошибка опций: & error]) {

  • Наконец, я выполнил чистую сборку перед запуском приложения.

При сбое приложения появляется следующая ошибка ...

The operation couldn’t be completed. (Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration

Теперь для отладки я добавил следующий код ...

    NSError *error = nil;
    NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error];

    if (!sourceMetadata) {
        NSLog(@"sourceMetadata is nil");
    } else {
        NSLog(@"sourceMetadata is %@", sourceMetadata);
    }

Отображает следующий результат ...

2011-01-20 18:18:41.018 MyApp[4438:207] sourceMetadata is {
    NSPersistenceFrameworkVersion = 248;
    NSStoreModelVersionHashes =     {
        Fugitive = <e33370b6 e7ca3101 f91d2595 1e8bfe01 3e7fb4de 6ef2a31d 9e50237b b313d390>;
    };
    NSStoreModelVersionHashesVersion = 3;
    NSStoreModelVersionIdentifiers =     (
    );
    NSStoreType = SQLite;
    NSStoreUUID = "E711F65F-3C5A-4889-872B-6541E4B2863A";
    "_NSAutoVacuumLevel" = 2;
}

Я проверил комплект приложений> MyApp.momd> VersionInfo.plist file

имеет следующее содержимое ...

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSManagedObjectModel_CurrentVersionName</key>
    <string>MyApp 2</string>
    <key>NSManagedObjectModel_VersionHashes</key>
    <dict>
        <key>MyApp</key>
        <dict>
            <key>Fugitive</key>
            <data>
            4zNwtufKMQH5HSWVHov+AT5/tN5u8qMdnlAje7MT05A=
            </data>
        </dict>
        <key>MyApp 2</key>
        <dict>
            <key>Fugitive</key>
            <data>
            N58Lf4BNpACzrsHAb1+BQImgjsBZ+u5G0wGUyt84+Ec=
            </data>
        </dict>
    </dict>
</dict>
</plist>

Что мне здесь не хватает?

ОБНОВЛЕНИЕ : Проблема оказалась атрибутом значения по умолчанию, который я пропустил в модели.

1 Ответ

3 голосов
/ 21 января 2011

Вы можете попытаться заставить Core Data вывести модель сопоставления:

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

Если изменения в вашей модели были тривиальными, то Core Data может вывести модель сопоставления.Если это не удастся, вам, вероятно, потребуется создать модель отображения (и вернуться к параметрам, которые вы используете в настоящее время).

Модели отображения легко создавать.Однако будьте внимательны, если вы измените модель данных, вам также потребуется обновить отображение.

Возможно, вы захотите проверить этот пост SO .

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