在coredata中,entity中attribute的類型隻有固定的幾種可選。如下圖:

有沒有方法擴充類型呢?方法當然是有的。原理是把要存類型轉化為二進制的方式存在資料庫中。 比如我們要想直接存放UIImage到資料庫,如何做?
首先,在coredata中建立的attribute中類形選擇Transformable. 意思表示這個字段是自定義的類型。然後在生成的NSManagedObject檔案中,将類型id改為自己想要的類型,如UIImage. 在xcode中字段的attribute中 name那一行寫你轉化的類,如寫下面的注冊的UIImageToDataTransformer
然後,建立類:UIImageToDataTransformer,繼承于NSValueTransformer。代碼如下:
- @interface UIImageToDataTransformer : NSValueTransformer {
- }
- @end
- #import "UIImageToDataTransformer.h"
- @implementation UIImageToDataTransformer
- + (BOOL)allowsReverseTransformation {
- return YES;
- }
- + (Class)transformedValueClass {
- return [NSData class];
- }
- - (id)transformedValue:(id)value {
- return UIImagePNGRepresentation(value);
- }
- - (id)reverseTransformedValue:(id)value {
- return [[UIImage alloc] initWithData:value];
- }
- @end
然後在你的NSManagedObject中注冊轉化類,那麼在存、取資料庫的時候就會進行轉化,如上面的UIImage 到 NSData, NSData到UIImage.
- + (void)initialize {
- if (self == [MyEntity class]) {
- UIImageToDataTransformer *transformer = [[UIImageToDataTransformer alloc] init];
- [NSValueTransformer setValueTransformer:transformer forName:@"UIImageToDataTransformer"];
- }
- }
這樣就可以直接存UIImage類型的資料到資料庫,實質還是存的二進制。
非常重要的一點,進行了Transformable的的字段是不能進行like,contains,in這樣的條件查詢,隻能是簡單的字段名=XXX的查詢。
Apple有一個Sample, 可以下載下傳下來運作看效果:https://developer.apple.com/library/ios/#samplecode/PhotoLocations/Listings/Classes_UIImageToDataTransformer_h.html
參看文檔:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html