2011-01-20 9 views
3

iPhoneのコアデータから始めたばかりで、軽量マイグレーションで問題が発生しました。iPhone Core Data軽量マイグレーション:モデルをマージできない

  • 私は私の古いモデルに2つの新しいフィールドを追加
  • モデルクラスファイルを再生し、現在のバージョンと新しいモデルバージョンを作った
  • は、テンプレートに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; 
} 

Pバンドル> 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

PropertyList EditorでVersionInfo.plistを開いたときに、逃亡のデータ項目はどのように見えますか?生のXMLでは、64ビットでエンコードされているように見えます。メタデータ呼び出しによって提供される16進表現と簡単に比較するのは難しいです(少なくとも私にとって)。 – westsider

+0

'4zNwtufKMQH5HSWVHov + AT5/tN5u8qMdnlAje7MT05A =' == あなたのオリジナルモデルはあなたの "MyApp"モデルと一致しています。これはいい。 – westsider

答えて

3

あなたはマッピングモデルを推測するためにコアデータを強制的に試してみてください:あなたのモデルへの変更は些細だったら

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

は、その後、Core Dataはマッピングモデルを推測することができるかもしれません。それが失敗する場合は、おそらくマッピングモデルを作成し、現在使用しているオプションに戻す必要があります。

マッピングモデルは簡単に作成できます。ただし、データモデルを変更する場合は、マッピングを更新する必要がありますので注意してください。

this SO postをチェックしてください。

関連する問題