首页 > 代码库 > Core Data浅谈系列之十 : 关于数据模型中实体的属性

Core Data浅谈系列之十 : 关于数据模型中实体的属性

之前写了《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


Brief Talk About Core Data Series, Part 10 : About NSEntityDescription‘s Attributes

Jason Lee @ Hangzhou
Blog : http://blog.csdn.net/jasonblog
Weibo : http://weibo.com/jasonmblog