2011-01-20 2 views
3

Я только что начал с основных данных iPhone, и у меня возникла проблема в легкой миграции.iPhone Core Data Lightweight Migration: не удается объединить модели

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

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

    если ([persistentStoreCoordinator_ addPersistentStoreWithType: конфигурация NSSQLiteStoreType: нет URL: опции storeURL: опции ошибки: & ошибка!]) {

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

Я получаю следующее сообщение об ошибке, когда происходит сбой приложения ...

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; 
} 

Я проверил ap р расслоением> MyApp.momd> VersionInfo.plist файл

его получил следующего содержания ...

<?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> 

Что я здесь отсутствует?

UPDATE: Проблема оказалась атрибутом значения по умолчанию, который я пропустил в модели.

+1

Каковы элементы элементов Fugitive, когда вы открываете VersionInfo.plist с помощью редактора списка свойств? В необработанном XML-представлении представляется 64-битным кодированием, что делает их трудными (по крайней мере для меня) легко сравнивать с шестнадцатеричным представлением, предоставляемым вызовом метаданных. – westsider

+0

'4zNwtufKMQH5HSWVHov + AT5/tN5u8qMdnlAje7MT05A =' == , поэтому вы оригинальная модель соответствует вашей модели «MyApp». Это хорошо. – westsider

ответ

3

Вы можете попробовать принудительный Core Data, чтобы вывести модель отображения:

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

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

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

Возможно, вы захотите зарегистрироваться this SO post.