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];
}


参考