2010-11-24 42 views
0

我正在使用核心數據拍攝照片並保存它們的小型項目,非常簡單。我有兩個實體;一個是'人',另一個是'圖像'。從Person到Image的關係是多對多的,從Image到Person我也有相反的關係。在'一對多關係'環境中將圖片保存在覈心數據中

所有我需要的時刻是添加圖像(從iPhone相機拍攝或從庫中選擇)的倍數一個人實體

我想知道是否有任何類型的示例代碼處理與使用核心數據的UIImage的多對多關係。

非常感謝。

=====================

其實我希望我能指出問題。我想要做的使用,在一對多的關係,給出了免費接入方法來添加對象,如

- (void)addPersonImageObject:(PersonImage *)value; 

和相關ImageToDataTransformer也是我實現方法是。

我在這件事上花了近一週的時間,我想我需要一個指導示例代碼,我可以先爲我的添加項目學習。

+0

我不確定問題是什麼。你在編碼UIImage對象到NSData對象時遇到問題嗎?或者,您是否無法創建從父到圖的多對多關係?抽象地說,這是兩個無關的問題。另外,你是否繼承NSManagedObject並創建父類和圖像類? – westsider 2010-11-24 17:35:15

回答

3

除了將UIImage轉換爲NSData之外,還有沒有什麼特別之處在於與UIImage有多對多的關係。因此,包含多對多關係的任何核心數據教程都已足夠。如果您需要示例代碼,您可以查看Apple的iPhoneCoreDataRecipes

幾個指針可以幫助您開始。讓我們假設我們有一個PersonViewController從被調用的東西像一個'的UITableViewController」繼承:

PersonViewController *personViewController = [[[PersonViewController alloc] init] autorelease]; 
personViewController.person = ... // get the selected person 
personViewController.managedObjectContext = self.managedObjectContext; 
[self.navigationController pushViewController:personViewController animated:YES]; 

PersonViewController具有以下屬性:

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain) Person *person; 
@property (nonatomic, copy) NSArray *images; 

有添加按鈕,它會穿鞋的圖片選擇器

- (void)insertNewObject { 
    UIImagePickerController *imagePicker = [[[UIImagePickerController alloc] init] autorelease]; 
    imagePicker.delegate = self; 
    [self presentModalViewController:imagePicker animated:YES]; 
} 

然後在回調imagePickerController:didFinishPickingMediaWithInfo:我們可以:

// Get the image from the picker 
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 

// Transform the image to NSData 
ImageToDataTransformer *transformer = [[[ImageToDataTransformer alloc] init] autorelease]; 
NSData *imageData = [transformer transformedValue:image]; 

// Create a new PersonImage entity and assign the image data  
PersonImage *personImage = [NSEntityDescription insertNewObjectForEntityForName:@"PersonImage" inManagedObjectContext:self.managedObjectContext]; 
personImage.imageData = imageData; 

// This is where we are adding the image to our person 
[self.person addImagesObject:personImage]; 

// Core data save, however you want to do it. 
NSError *error = nil; 
if (![self.managedObjectContext save:&error]) { 
    abort(); 
} 

// simple trick to update the table view data source  
self.images = nil; 
[self.tableView reloadData]; 
// don't forget to dismiss the picker 
[self dismissModalViewControllerAnimated:YES]; 

images的實施只是爲了保持它的簡單

- (NSArray *)images { 
    if (images_) { 
     return images_; 
    } 

    // since we set self.images = nil when adding a new image we will get the list 
    // of all images from our person object. 
    images_ = [[self.person.images allObjects] retain]; 
    return images_; 
} 

表視圖數據源的方法也只是:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.images.count; 
} 

但是並創建電池其實並不重要。在那麼如果我們想要做的,我們可以做一些事情的一些圖像從相機tableView:didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // get the tapped person image  
    PersonImage *personImage = [self.images objectAtIndex:indexPath.row]; 
    // get the image 
    ImageToDataTransformer *transformer = [[[ImageToDataTransformer alloc] init] autorelease]; 
    UImage *image = [transformer reverseTransformedValue:personImage.imageData]; 
    // do something with the image. 

} 
+0

歡呼羅伯特。讓我chk我的imagePickerController:didFinishPickingMediaWithInfo根據您的代碼。我的和你很相似,但是一定有一些我錯過了。請稍後再來。 – bicbac 2010-11-24 22:58:59

+0

我錯過了在'personImage.imageData = imageData'之前沒有將圖像數據更改爲NSData。好像沒有警告或錯誤信息,所以讓我問你一個問題。您以後使用NSArray圖像來獲取PersonImage。我不知道爲什麼我們需要它,因爲一旦我們使用多對多關係將一個人的多個圖像保存到核心數據中,那麼必須有一種方法來以相同方式獲取這些圖像。 – bicbac 2010-11-25 01:08:25

0

圖片可能是非常大的。核心數據中的圖像的一般規則低於1 MB。您可能想要將圖像存儲在目錄中並將路徑存儲在Core Data中。