CoreDataでUIImage(バイナリデータ)を保存する
CoreDataでUIImage(その他バイナリデータ)を保存したいぜ! という場合がきっとあると思う。サイズによって、やり方は異なる。小さいものは同じエンティティ、中くらいは関連づけた他のエンティティ、大きいものはデバイス内へのパス。詳細は割愛。写真のサイズから考えて、小さい画像はサムネイルで持っておいて、実際はパスを持つ、とかありかもしれん。パフォーマンスとかも色々あるらしいですよ。。。やってみないとわからんね。。。
概要やポイント
- 型は Transformable
- NSValueTransformerのサブクラス HogeTransformer(クラスメソッド2つと、インスタンスメソッド2つを実装)を作成する。
- DataModel インスペクタで、 Attribute Type が Transformable にしていると、「Name」があるので、そこに「HogeTransformer」といれておく。
- FileのNew からエンティティに対応したNSManagedObjectのサブクラスを作る。その型は「id」になる
プロパティへのアクセスは、idなのでUIImageと思ってていい感じなのかな…?
上の3番目が盲点だった。
UIImageの場合は、Appleのレシピのサンプルコードではこんなんなってる。
他の場合は、わからん。。。
+ (BOOL)allowsReverseTransformation { return YES; } + (Class)transformedValueClass { return [NSDate class]; } - (id)transformedValue:(id)value { NSData *data = UIImagePNGRepresentation(value); return data; } - (id)reverseTransformedValue:(id)value { UIImage *uiImage = [[UIImage alloc] initWithData:value]; return [uiImage autorelease]; }
参考
- Appleのサンプルコード iPhoneCoreDataRecipes
- Store a UIImage in Core Data using a value transformer | Peter McIntyre
- Core Data Performance : バイナリデータの保存 | Natsu note / あとから発見した。。orz