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這個話題,這裏有更進一步的討論:
https://stackoverflow.com/questions/4158286/storing-images-in-core-data-or-as-file
https://stackoverflow.com/questions/16685812/how-to-store-an-image-in-core-data
而關於上麵討論的內容,也有一些相關鏈接:
https://stackoverflow.com/questions/14256762/what-is-the-difference-between-transformable-and-binary-data
https://stackoverflow.com/questions/6783091/when-not-to-use-core-data-type-transformable
https://stackoverflow.com/questions/1562676/best-practice-array-dictionary-as-a-core-data-entity-attribute
https://stackoverflow.com/questions/3014498/what-can-i-do-with-an-transformable-attribute-type-in-core-data-on-the-iphone
最後更新:2017-04-03 07:56:55