[iOS][Mac] CoreData - マイグレーション[4] モデルファイルの構成

2010年12月12日日曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

[前回] Cocoaの日々: [iOS][Mac] CoreData - マイグレーション[3] エラー

モデルファイルの構成・配置についてのまとめ。


モデルファイルの構成〜Xcode


XcodeでCore Data のモデルを定義すると <modelname>.xcdatamodeld というグループが作られ、その下に <modelname>.xcdatamodel ファイルが配置される。モデルファイルをバージョンアップするとこのグループ内にバージョン毎のモデルファイルが追加されていく。下記はバージョン1とバージョン2が存在する例。


モデルファイルの構成〜実体


<modelname>.xcdatamodeld の実体はパッケージ(フォルダ)である。
Finderで見るとこう。
パッケージの中身を見ると <modelname-version>.xcdatamodel が格納されているのがわかる。


モデルファイルの構成〜実行時


これをビルドするとその結果アプリケーションバンドル内には <modelname>.momd というフォルダが作成され、その中に <modelname-version>.mom ファイルが格納される。先ほど例に上げたファイルの場合、HairConcierge.momd というパッケージ内に HairConcierge.mom, HairConcierge 2.mom が格納される。
VersionInfo.plist はバージョン管理情報が格納されている。中身はこんな感じ。
どのバージョンのモデルを使っているのか、またそれぞれのバージョンで使用しているエンティティのリストが格納されている。

なお、複数のバージョンが存在しない場合(一番最初のバージョンなど)は <modelname>.momd は存在せず、バンドルフォルダのルートレベルに <modelname>.mom ファイルが設置される。
(単一、複数で配置場所が変わることがバージョンアップ時の問題を引き起こす。問題の対応方法については前回の記事を参照のこと)


トラブル


先日訳あってモデルファイル名を変更した。具体的には頭大文字を小文字にした。
HairConcierge.xcdatamodeld → hairConcierge.xcdatamodeld
それと同時にモデルファイルをバージョンアップし、マイグレーションの設定を行った。

この新しいバージョンのアプリをビルドして古いバージョンを上書きインストールしたところマイグレーションが行われない現象が出た。原因がわからずいろいろ調べているとアプリケーションバンドル内のモデルファイルが旧バージョンしか存在しないことがわかった。
HairConcierge.momd
         |--HairConcierge.mom
         |--VersionInfo.plist
本来は新しいバージョンのモデルファイル HairConcierge 2.mom が存在するはず。??

さらに調べると momdフォルダが2つ存在することが判明。
HairConcierge.momd
         |--HairConcierge.mom
         |--VersionInfo.plist

hairConcierge.momd
         |--hairConcierge.mom
         |--hairConcierge 2.mom
         |--VersionInfo.plist
原因はなんとモデルファイルの名前を変えたことだった。頭を大文字から小文字に変えたため、旧バージョンのモデルファイルと別扱いになっていた。マイグレーションが実行されなかったのは、2つの momdフォルダのうち旧バージョンだけが含まれる前者を使っていたから。なんてこった。

旧バージョンは既に App Store で配布しているので今回は名前を元に戻すしか無い(大文字に戻す)。実際、名前を元に戻したところ、上記のような2つの momd フォルダは作成されず、無事にマイグレーションが行われた。構成はこんな感じになる。
HairConcierge.momd
         |--HairConcierge.mom
         |--HairConcierge 2.mom
         |--VersionInfo.plist


教訓:リリース後にモデルファイル名を変えてはいけない!

[参考] Cocoaの日々: [iOS] プロダクト名を変えてはいけない

Responses

Leave a Response

人気の投稿(過去 30日間)