Core Data Document-based Applicationでファイルパッケージを扱う (1)

Core Data Document-based ApplicationではFileWrapperを使えない?


Core Data Document-based Applicationでは,ドキュメントの管理はNSPersistentDocumentが行なう。
テンプレートにはいっているMyDocumentは,NSPersistentDocumentのサブクラス。
これを使えば,とくに何も書かなくても,ひとつのCoreDataファイル(永続ストア)の生成,読み書きをしてくれる。


逆から言うと,NSPersistentDocumentによるCore Data Document-based ApplicationではCore DataがサポートするXML,Binary,SQLiteのファイルしか(自動的には)扱えないのであって,つまり,ひとつのドキュメントのデータはひとつのCoreDataファイルとして保存されることを想定している。


http://www.cocoadev.com/index.pl?NSPersistentDocumentAsPackageにもあるように,NSPersistentDocumentではFileWrapperの読み書きをサポートしていないから,CoreDataファイルをあるFilePackageのなかに保存し,扱うことはむずかしい。

FileWrapperというか,File Packageが使えればいいんだけど


Core Dataでオブジェクトグラフを管理したいんだけど,画像やムービーなんかのデータはCore Dataの内部じゃなくてファイルとして保持したい。また,Core Dataに入れるまでもない設定ファイルとかその他関連ファイル,…なんかを別ファイルとして保持したい。


こういう場合,単にフォルダにCoreDataファイルとかその他ファイルを入れて,そのうちどれかのファイルをApplicationで開くようにしてもいいけれど(Xcodeのプロジェクトフォルダと,xcodeprojファイルのように),頻繁にFinderでフォルダ内部のファイルへアクセスする必要がなく,フォルダをひとつのファイルのように見せて,フォルダをダブルクリックで開けたりする方が便利ならば,ファイルパッケージを使うことができる。
ファイルパッケージの例としては,リッチテキストのrtfdとか。インラインの画像ファイルとか入ってるはず。


なんとかしてCore Data Document-based Applicationで簡単にファイルパッケージを扱えないかなぁ。

プロジェクトをつくってみる


とりあえずの目標を,ファイルパッケージの中にCoreDataファイルを格納し,Finderからはファイルパッケージのダブルクリックで開くことにする。


Xcodeから,Core Data Document-based Applicationを作成。
扱うファイルパッケージの拡張子はtestpackageで,Packageチェックをいれる。
内部のCoreDataファイルの拡張子はtestdbとする。


http://itools.jp/%7e0003/hatena/CoreDataPackage/documenttypes.png


扱うデータモデルは,画像にタイトルをつけたものとする。MyDocument.xcdatamodelを開いて"Photo"エンティティを作成,Classは"PhotoMO"に(あとで実装),Attributesはdata(Binary),title(String)で,dataもtitleも,OptionalではなくTransientではなくする(必須属性とする)。


>Photo,PhotoMO,data
>title


MyDocument.nibを開き,PhotoエンティティのNSArrayControllerをひとつ用意し,File's OwnerのmanagedObjectContextとバインド。タイトル表示用のTableViewを用意し,arrangedObjectsの"title"へバインド。画像表示用のImageViewを用意し,selectionの"image"へバインド(imageはあとでかく)。


http://itools.jp/%7e0003/hatena/CoreDataPackage/bindings.png


つづく?
Core Data Document-based Applicationでファイルパッケージを扱う (2) - banjunの日記