こんにちは。きんくまです。
CoreDataのメモです。
別プロジェクトで作った.xcdatamodeldファイル(EntityやAttribute設定ずみ)を他のプロジェクトにドラッグ&ドロップで持ってきました。
それで読み込んだ方のAppDelegateで読み込むファイル名をそのファイル名に変更しました。
//AppDelegate内 //- (NSManagedObjectModel *)managedObjectModelのところ NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataTestModel" withExtension:@"momd"]; //- (NSPersistentStoreCoordinator *)persistentStoreCoordinatorのところ NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataTestModel.sqlite"];
それでビルドするとエラーがでます。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
解決方法
最初、絶対にファイルメニューから新規でxcdatamodelファイルを作って、そこからスタートするのかと思いました。
調べてみたところ、きちんとやり方がありました。
>> iPhone – Add Core Data To existing Project?
Chris Gummerさんによると
・momdファイルはバージョン化されたmomファイル
・外から持ってきたxcdatamodelはまだバージョン化されていないmomファイルの状態
・なので、もしインポートしたいときは.xcdatamodelを選択してEditor > Add Model Versionする
(元コメントはXcode3用?っぽかったのでXcode4だとこうなる)
・Xcodeのファイルメニューから作るxcdatamodelファイルは作成時に自動でバージョン化されている
・もしバージョン化しない場合はmodelを読み込む拡張子をmomdでなくmomにする
バージョン化って何なのかというと、CoreDataのモデリングしてアプリをリリースした後に、
アップデートなどで、例えばEntityやAttributeを追加したいときがあります。
そういうときに、モデリングのバージョンを別バージョンとして定義することが可能です。
古いバージョンから新しいバージョンにするときは、更新というか統合というかそういう作業が必要なのですが、まだ詳しくないのでそこは省略。
今回の場合、ドラッグドロップしたばっかりがこんな感じです。
このときはバージョン化されてない状態なので、拡張子momで読み込み。.xcdatamodelというファイルになっている。
それをバージョン化するとこんな感じになります。拡張子momdで読み込み。xcdatamodeld(dが末尾に追加)というファイルになっている
緑のチェックが現在のバージョン
さて、これでうまくいくのですが、なんかインポートしただけなのにいらないバージョンがあるというのはどうもいやな感じです。
で、いらないバージョンを削除する方法を調べてみました。
>> How to delete an old/unused Data Model Version in xCode 4
David Avendasoraさんのコメントによると
1. 欲しいバージョンをXcode上でカレントバージョンにセット。
2. .xcdatamodeldをファイルメニューから削除(Remove Reference Only)
3. Finderで.xcdatamodeldを選択して、右クリック > Show Package Contents
4. いらない.xcdatamodelファイルを削除
5. もう一回プロジェクトに.xcdatamodeldを追加
するとXcodeで新規ファイルを作成した状態になっています。
良かった良かった。
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ