CoreData でマイグレーションエラー

CoreData を試して最初につまずいたのがこれ。1個エンティティを追加しただけなのに、いきなりエラーかよ(怒)!

2010-07-10 13:42:23.939 Locations[1817:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0xb32a1b0 {metadata={type = immutable dict, count = 6,
entries =>
  … 中略
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            Event = ;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "CC15632C-1672-41DB-AD97-1E8499E78922";
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}
プログラムはシグナルを受信しました:“SIGABRT”。
(gdb) 

エラー原因

マイグレーション処理が必要なのに、そのまんま実行しようとしてること。マイグレーション方法は "Core Data Model Versioning and Data Migration Programming Guide" に書いてあるとのこと。

そもそもエラーが返された理由も「スキーマを変更するとデータが壊れやすいから、ちゃんとマイグレーション処理をしましょう」ってことだったらしい。ハイ、そのとおりです。僕が悪かったです。怒ってすみません。早めに覚えます。φ(.. ;)

応急処置

とはいえ、初心者としてはいろいろ覚えることが多くて大変なので、思いついた簡単な逃げ方。

iPhone アプリを削除して Xcode を再実行」

そもそも、はじめてアプリが起動されたときに作られた *.sqlite ファイルと、スキーマ変更後の情報がミスマッチするのが原因っぽい。なので、一度、アプリを削除すると *.sqlite を含むアプリデータが全てが削除され、Xcode で再実行時に作り直されるので、とりあえず問題解決?という理屈。う〜ん、我ながら場当たり対処だ。:-p

iPhone シミュレータの場合 *.sqlite は↓のところに格納されてるので、削除前に *.sqlite のバックアップはとっておいてくださいね。トラブルがあっても責任は負えないので、自己責任でお願いしますよ。:-)

$HOME/ライブラリ/Application Support/iPhone Simulator//Application//Documents/.sqlite
2010/11/15 追記

このネタ、書籍 "基礎から学ぶ iPhone アプリ開発"(C&R研究所) の p217「ひな形のシリアライズ情報の削除」で紹介されてた。応急処置も合ってたみたい :-)