之前写了《Core Data浅谈系列汇总》,今天稍微回顾了下,做些补充。
在这个系列的第一篇《基础结构》中(2013年1月份的文章,时间过得好快啊!),有简单带过Entity的Attribute:
- 数据类型、布尔值统一用NSNumber来表示;
- 字符串类型用NSString表示;
- 时间类型用NSDate表示;
- 二进制数据类型用NSData表示;
- 非标准类型用Transformable来表示;
而Attribute还有其自身的Properties,比如Transient表示不用持久化到磁盘,Optional表示非必填字段(如果必填字段为空保存时会出错),Indexed则表示索引字段。
这里主要讨论下Binary Data和Transformable两种。
以存储UIImage为例,如果使用Binary Data类型来存储,那么字段设为对应类型:
@property (nonatomic, retain) NSData * image;
在赋值之前需要将UIImage先转为NSData类型。这一步对于UIImage类型来说可能比较方便,可以直接调用类似
UIKIT_EXTERN NSData *UIImagePNGRepresentation(UIImage *image);的函数进行转换,不过如果对于其它类型,尤其是自定义的类型来说,每次都要如此操作则显得很麻烦,使用Transformable类型可以通过NSValueTransformer及其扩展来优化这个步骤:
#import <Foundation/Foundation.h> @interface UIImageTransformer : NSValueTransformer @end
如果是自定义Person结构,可能就叫做DIYPersonTransformer。
有了这么个Transformer,可以在面板里面进行指定,但在其可以顺利工作之前需要提供几个方法:
+ (BOOL)allowsReverseTransformation { return YES; }
表示可以双向转换,写进去和读出来都是通的。
+ (Class)transformedValueClass { return [NSData class]; }
表示实际存储的类型。
- (id)reverseTransformedValue:(id)value { // } - (id)transformedValue:(id)value { // }
表示实际的转换方法。
但是说到使用Core Data存储UIImage这个话题,这里有更进一步的讨论:
http://stackoverflow.com/questions/4158286/storing-images-in-core-data-or-as-file
http://stackoverflow.com/questions/16685812/how-to-store-an-image-in-core-data
而关于上面讨论的内容,也有一些相关链接:
http://stackoverflow.com/questions/14256762/what-is-the-difference-between-transformable-and-binary-data
http://stackoverflow.com/questions/6783091/when-not-to-use-core-data-type-transformable
http://stackoverflow.com/questions/1562676/best-practice-array-dictionary-as-a-core-data-entity-attribute
http://stackoverflow.com/questions/3014498/what-can-i-do-with-an-transformable-attribute-type-in-core-data-on-the-iphone