2010-11-24 2 views
0

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

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

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

много спасибо.

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

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

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

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

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

+0

Я не уверен, в чем вопрос. У вас возникли проблемы с кодировкой объектов UIImage для объектов NSData? Или у вас возникли проблемы с созданием многих отношений от Parent to Image? В реферате это две несвязанные проблемы. Кроме того, вы подклассифицируете NSManagedObject и создаете классы Parent и Image? – westsider

ответ

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 my imagePickerController: didFinishPickingMediaWithInfo на основе вашего кода. Моя очень похожа на твою, но должно быть что-то мне не хватает. пожалуйста, приходите и chk позже. – bicbac

+0

что я пропустил, я не изменил данные изображения в NSData до 'personImage.imageData = imageData;'. похоже, что нет предупреждений или сообщений об ошибке, поэтому позвольте мне задать вам один вопрос. Вы использовали изображения NSArray для получения PersonImage позже. Я не знаю, зачем нам это нужно, потому что когда мы сохраняем несколько изображений одного человека в Core Data, используя отношения «многие-многие», тогда должен быть способ получить эти изображения одинаково. – bicbac

+0

Думаю, я понял. просто удалось сохранить несколько изображений на объекте и проверить их один за другим. Великий! (еще многое предстоит сделать, конечно). «Помимо преобразования UIImage в NSData и обратно нет ничего особенного, если у вас есть отношения с UIImages». , ваш код и CoreDataRecipe (каждый раз, когда я смотрю на этот образец, он дает мне что-то новое ...) были «очень полезны». Спасибо. – bicbac

0

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

+0

, когда я тестирую свое приложение с одним человеком и одним изображением (отношения один к одному) на устройстве, производительность не так уж плоха. Большое спасибо за советы. – bicbac

Смежные вопросы