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" に書いてあるとのこと。
そもそもエラーが返された理由も「スキーマを変更するとデータが壊れやすいから、ちゃんとマイグレーション処理をしましょう」ってことだったらしい。ハイ、そのとおりです。僕が悪かったです。怒ってすみません。早めに覚えます。φ(.. ;)
応急処置
とはいえ、初心者としてはいろいろ覚えることが多くて大変なので、思いついた簡単な逃げ方。
そもそも、はじめてアプリが起動されたときに作られた *.sqlite ファイルと、スキーマ変更後の情報がミスマッチするのが原因っぽい。なので、一度、アプリを削除すると *.sqlite を含むアプリデータが全てが削除され、Xcode で再実行時に作り直されるので、とりあえず問題解決?という理屈。う〜ん、我ながら場当たり対処だ。:-p
iPhone シミュレータの場合 *.sqlite は↓のところに格納されてるので、削除前に *.sqlite のバックアップはとっておいてくださいね。トラブルがあっても責任は負えないので、自己責任でお願いしますよ。:-)
$HOME/ライブラリ/Application Support/iPhone Simulator//Application/ /Documents/ .sqlite
2010/11/15 追記
このネタ、書籍 "基礎から学ぶ iPhone アプリ開発"(C&R研究所) の p217「ひな形のシリアライズ情報の削除」で紹介されてた。応急処置も合ってたみたい :-)