Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2012年06月05日

古いプロジェクトでCore Data マイグレーションを行うときの注意点



Core Dataのマイグレーションを行うとき、Xcode4.2でテンプレートから生成されたmanagedObjectModelメソッドは、下記のようになっている。
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil) {
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Fuga" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}


Xcode3.x以前で作成したプロジェクトの場合、下記のようにmanagedObjectModelはmergedModelFromBundles:nilで取得している。
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil) {
return __managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return __managedObjectModel;
}

mergedModelFromBundlesで取得した場合、アプリケーションバンドル内の新旧のモデルファイルを文字通りmergeして取得してしまう。
このままだとマイグレーションはおろか、通常のpersistentStoreCoordinatorインスタンスの取得さえもできず、アプリがクラッシュする。

このため、mergedModelFromBundlesで取得するようになっている場合、Xcode4.2で生成したときのように修正する必要がある。

※設定項目:
 URLForResource : マッピングモデル名称
 withExtension : "momd"固定
 
(例)
Hoge_v2.xcdatamodeld  // マッピングモデル
  Hoge.xcdatamodel // 旧データモデル
  Hoge_v 2.xcdatamode // 新データモデル

URLForResourceには、"Hoge_v2"を設定する。
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Hoge_v2" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];


※注意点
上記の場合、マッピングモデルのファイル名は、"Hoge_v2.xcdatamodeld"だが、withExtensionに"xcdatamodeld"を設定してはならない。
"momd"にすること。これはビルドして生成されるアプリケーションバンドルでは、マッピングモデルを"momd"というフォルダで管理していることによるもののようだ。

また、ビルド時はクリーンアップしてから行うこと。

参考記事:
http://cocoadays.blogspot.jp/2010/12/iosmac-coredata-2.html
http://bit.ly/Ke7beO
http://d.hatena.ne.jp/at_yasu/20100328/p1

posted by mobileDeveloper at 23:23 | Comment(0) | TrackBack(0) | 開発の流れ はてなブックマーク - 古いプロジェクトでCore Data マイグレーションを行うときの注意点 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。