在“多对多关系”环境中将图片保存在Core Data中

时间:2010-11-24 11:24:06

标签: iphone core-data uiimage save one-to-many

我正在处理我的小项目,它使用Core Data拍摄并保存它们非常简单。我有两个实体;一个是'人',另一个是'图像'。从人到图像的关系是多对的,从图像到人,我也有反向关系。

目前我需要的是 将多个图像(从iphone相机中选取或从库中选择)添加到一个Person实体

我想知道是否有任何类型的示例代码使用Core Data来处理与UIImage的多对多关系。

非常感谢。

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

其实我希望我可以指明问题。我正在尝试做的是使用在多对多关系中免费提供的访问方法来添加对象,例如

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

我也实现了与ImageToDataTransformer相关的方法。

我花了将近一个星期的时间来处理这个问题,我想我需要一个指导性的示例代码,我可以先为我的添加项目学习。

2 个答案:

答案 0 :(得分:3)

除了将UIImage转换为NSData之外,与UIImage s建立多对多关系并没有什么特别之处。因此,任何包含多对多关系的核心数据教程都应该足够了。如果您需要示例代码,可以查看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.

}

答案 1 :(得分:0)

来自相机的图像可能非常大。核心数据中图像的一般规则低于1 MB。您可能希望将图像存储在目录中,并将路径存储在Core Data中。

相关问题