天天看點

CoreData中存任意類型的資料

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

CoreData中存任意類型的資料

有沒有方法擴充類型呢?方法當然是有的。原理是把要存類型轉化為二進制的方式存在資料庫中。 比如我們要想直接存放UIImage到資料庫,如何做?

首先,在coredata中建立的attribute中類形選擇Transformable.  意思表示這個字段是自定義的類型。然後在生成的NSManagedObject檔案中,将類型id改為自己想要的類型,如UIImage.  在xcode中字段的attribute中 name那一行寫你轉化的類,如寫下面的注冊的UIImageToDataTransformer

然後,建立類:UIImageToDataTransformer,繼承于NSValueTransformer。代碼如下:

  1. @interface UIImageToDataTransformer : NSValueTransformer {  
  2. }  
  3. @end  
  1. #import "UIImageToDataTransformer.h"  
  2. @implementation UIImageToDataTransformer  
  3. + (BOOL)allowsReverseTransformation {  
  4.     return YES;  
  5. }  
  6. + (Class)transformedValueClass {  
  7.     return [NSData class];  
  8. }  
  9. - (id)transformedValue:(id)value {  
  10.     return UIImagePNGRepresentation(value);  
  11. }  
  12. - (id)reverseTransformedValue:(id)value {  
  13.     return [[UIImage alloc] initWithData:value];  
  14. }  
  15. @end  

然後在你的NSManagedObject中注冊轉化類,那麼在存、取資料庫的時候就會進行轉化,如上面的UIImage 到 NSData, NSData到UIImage. 

  1. + (void)initialize {  
  2.     if (self == [MyEntity class]) {  
  3.         UIImageToDataTransformer *transformer = [[UIImageToDataTransformer alloc] init];  
  4.         [NSValueTransformer setValueTransformer:transformer forName:@"UIImageToDataTransformer"];  
  5.     }  
  6. }  

這樣就可以直接存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