2013-08-07 189 views
0

我想將照片保存至核心數據。我在互聯網上查找並找到許多關於核心數據的資源,但是我找不到我想要完成的一個。我想使用核心數據來保存用戶已經拍攝的圖像,然後希望用戶選擇他想要保存的圖像。就像他正在將圖片分類爲肉類或蔬菜等類別。爲此,我製作了一個名爲「照片」的實體,並放置了6個屬性名稱,例如肉類蔬菜。我還沒有選擇類型。我想用戶選擇類別並保存一個屬性。這是問題。我想這樣做,但我找不到符合我想要的資源。我也在做正確的想法使用多個屬性?將照片保存至核心數據

回答

0

不,這不是一個好方法。目前,您每個entity都有six attributes。這將導致爲您的數據庫中的每一行創建無用的5個屬性

取而代之的是,你可以爲你的Categoryenumenum值存儲在您的coreData

所以,你可以添加任何數量的類別中的enum爲未來的增強也,你不必在乎你存儲在coreData

就像這樣。

typedef enum imageType { 
    vegetables = 0, 
    fruits = 1, 
    animals = 2, 
    scenaries = 3, 
    Nature = 4, 
    Home = 5, 
    Architecture = 6 
} 

和你的coreData實體是這樣的。

ImageEntity

NSData *imageData; 
NSNumber *typeEnum; 

你可以有你的類的名稱的數組,並用它在你的應用程序到enum與類別的確切名稱匹配您UIPickerView或以其他組件。

你的數組可能是這樣的。

NSArray *categoryArray = [NSArray arrayWithObjects:@"vegetables", @"fruits", @"animals", @"scenaries", @"Nature", @"Home", @"Architecture", nil]; 

而且你可以像這樣訪問數組對象。

NSString *imageCategory = [categoryArray objectAtIndex:imageType.animals]; 
1

向下滾動用於存儲核心數據UIImage的數據,但首先一點有關核心數據屬性:你不應該使用針對不同類別的多種屬性,你應該有所謂的「類別」的單一屬性。這可能是一個整數或字符串,具體取決於您的實現。我建議使用一個整數,定義枚舉它如下:

typedef NS_ENUM(NSUInteger, MyFoodCategory){ 
    MyFoodCategoryVegetable = 0, 
    MyFoodCategoryMeat = 1, 
    MyFoodCategoryFish = 2, 
    MyFoodCategorySweet = 3, 
}; 

當你打印出來的觀點,這樣做如下:

-(void)setLabelTextForCategory:(MyFoodCategory)category 
{ 
    switch(category) { 
     case MyFoodCategoryVegetable: 
      self.categoryLabel.text = @"Vegetable"; 
      break; 
     case MyFoodCategoryMeat: 
      self.categoryLabel.text = @"Meat"; 
      break; 
     case MyFoodCategoryFish: 
      self.categoryLabel.text = @"Poisson"; //French 
      break; 
     case MyFoodCategorySweet: 
      self.categoryLabel.text = @"Dessert"; 
      break; 
    } 
} 

這意味着,如果你改變記住你想要爲每個類別打印什麼樣的測試,那麼你只需要在這個地方進行更改,而不必更改核心數據庫中的內容。例如,您可以使用本地化來顯示同一單詞的不同語言或變體。

核心數據

OK保存UIImage的數據,所以要回答你的主要問題。我個人會避免將圖像數據存儲在覈心數據中,而是將其保存到磁盤。查看使用NSFileManager類或將UIImage轉換爲NSData並寫入文件,例如

UIImage *image = ... 
NSData *imageData = UIImagePNGRepresentation(image); // or use UIImageJPEGRepresentation if it's a jpeg image 

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
NSString *fileName = @"imageWhatever1"; 
NSString *filePath = [documentsPath stringByAppendingPathComponent:fileName]; 
NSError *writeError = nil; 
if (![data writeToFile:filePath options:NSDataWritingAtomic error:&writeError]) { 
    NSLog(@"Failed to write file: %@", writeError); 
} 

但是,如果你寧願直接保存圖像核心數據,然後創建一個名爲「的imageData」的屬性和屬性類型設置爲「二進制數據」。然後將NSData對象保存到核心數據實體。當你讀了NSData對象,你可以按如下其轉換回的UIImage:

UIImage *imageLoadedFromDiskOrCoreData = [UIImage imageWithData:imageData]; 
+0

這也是不錯的使用自定義的'NSValueTransformer'像圖像非標準屬性。 Apple甚至在他們的PhotoLocations **示例應用程序中提供了這個示例實現。 –

+0

我想讓用戶使用'UIPickerView'來選擇要保存的類別,但我無法使其工作。對我來說,做什麼是一個好的起點? – AppleDevram