сохранение изображений в Core Data в среде «отношения со многими» - PullRequest
0 голосов
/ 24 ноября 2010

Я работаю над своим небольшим проектом, который делает снимки и сохраняет их, очень просто, с использованием Core Data. У меня есть две сущности; один - «Персона», а другой - «Имидж». отношения между Человеком и Имиджем слишком велики, а между Имиджем и Человеком у меня также были обратные отношения.

Все, что мне нужно на данный момент, это добавить несколько изображений (взятых с камеры iphone или выбранных из библиотеки) к одному объекту Person .

Я хотел бы знать, существует ли какой-либо пример кода, который имеет отношение ко многим отношениям с UIImage с использованием Core Data.

большое спасибо.

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

На самом деле, я бы хотел уточнить проблему. То, что я пытаюсь сделать, это использовать методы доступа, которые предоставляются бесплатно в отношении ко многим, чтобы добавить объект, такой как

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

а также я реализовал методы, связанные с ImageToDataTransformer.

Я потратил почти неделю на этот вопрос, и я думаю, что мне нужен пример кода, который я мог бы сначала изучить для своего проекта добавления.

Ответы [ 2 ]

3 голосов
/ 24 ноября 2010

Помимо преобразования UIImage в NSData и обратно, нет ничего особенного, если иметь отношение ко-многим с UIImage s.Таким образом, любой учебник по основным данным, который включает отношение ко многим, должен быть достаточным.Если вам нужен пример кода, вы можете проверить iPhoneCoreDataRecipes от Apple .

Несколько указателей, которые помогут вам начать работу.Давайте представим, что у нас есть 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 голосов
/ 25 ноября 2010

Изображения с камеры могут быть очень большими.Общее правило для изображений в Core Data ниже 1 МБ.Возможно, вы захотите сохранить изображение в каталоге и сохранить путь в Core Data.

...