сохранять изображения в основные данные с помощью волшебной записи

Я использую волшебную запись с Core Data.

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

Как хранить изображения с помощью Magical Record и Core Data?


person Totka    schedule 13.06.2013    source источник


Ответы (4)


Просто сохраните изображение в папке с документами приложения и сохраните строку с URL-адресом файла в основном объекте данных.

person Mundi    schedule 13.06.2013
comment
Итак, моя фотография атрибута имеет тип String? - person Totka; 14.06.2013
comment
Верно. Вы также можете называть его photoFileName или photoPath ... Apple рекомендует хранить в Core Data только очень маленькие изображения, такие как эскизы, и использовать эту технику для более крупных. - person Mundi; 15.06.2013
comment
Вы приняли ответ, который не имеет отношения к вашему вопросу. - person Mundi; 27.06.2013

То, что вы пытаетесь сделать выше, можно легко сделать. Лучший совет, который я могу вам дать, - это создать новый образец проекта только для сохранения и извлечения изображения из базы данных CoreData. Таким образом, вы точно знаете, как работает процесс. Если вы попытаетесь внедрить эту функциональность в свой текущий проект, вы можете потерять представление о том, что и где происходит.

Это очень быстрый пример, я ожидаю, что вы сами импортируете делегатов в свои файлы .h и т. Д.

Сначала запустите UIImagePicker через кнопку

-(IBAction)pickImage:(id)sender
{
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        [self presentModalViewController:imagePicker animated:YES];
}

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

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)selectedImage editingInfo:(NSDictionary *)editingInfo 

    self.imageButton.imageView.image = selectedImage; 

Чтобы сохранить его в CoreData, назначьте свой UIImage тип типу Transformable в своем атрибуте в базе данных, а затем сохраните managedObjectContext

Ссылки в помощь:

Справочник по классу UIImagePicker

Magical Record Docs

Образец проекта рецептов CoreData

Надеюсь на эту помощь, удачи!

person Omer Janjua    schedule 14.06.2013
comment
Спасибо!! Теперь у меня в приложении есть фото !! - person Totka; 18.06.2013
comment
Да, установка атрибута фото как трансформируемого замедляет работу моего приложения. много - person Totka; 28.06.2013

Я нашел свой ответ:

сохранить:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString*nomeImmagine = [[NSString alloc] initWithFormat:@"%@", self.fieldName.text];
NSString *pngFilePath = [NSString stringWithFormat:@"%@/%@.png",documentsDirectory, nomeImmagine];
UIImage *image = self.showSelectedImage.image; // imageView is my image from camera
NSData *data1 = [NSData dataWithData:UIImagePNGRepresentation(image)];
[data1 writeToFile:pngFilePath atomically:NO];

загрузить:

 -(void) loadImageFromPathInsideView
{
    // [self loadImageFromPathInsideView];
    Ricetta* contact =[[DataManager sharedClass]dammiTuttaLaRicetta:self.indice];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);

    NSString*nomeImmagine = [[NSString alloc] initWithFormat:@"%@", contact.nome2];
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString* path = [NSString stringWithFormat:@"%@/%@.png",documentsDirectory, nomeImmagine];;
    UIImage* image = [UIImage imageWithContentsOfFile:path];
    self.image.image = image;
}
person Totka    schedule 27.06.2013
comment
Это именно то, что я предложил в своем ответе. Это простой код доступа к файлам. Вам по-прежнему необходимо сохранить (относительный) URL-адрес в управляемом объекте. - person Mundi; 27.06.2013
comment
Спасибо. Добро пожаловать в SOF. - person Mundi; 01.07.2013

небольшой совет. хранить изображения в виде типа transformable (также известного как NSImage) в основных данных легко, но это приводит к общей низкой производительности приложения даже для небольшого числа (более 20), которое варьируется от 50 до 200 КБ при среднем значении 100 КБ. даже связывание этих файлов через отношения происходит медленно, учитывая, что один контроллер часто привязан к другому.

Вышеупомянутый метод сохранения имени локального пути в виде NSString, указывающего на папку «Документы», намного лучше для общего опыта.

При этом создание миниатюрного изображения (размером около 150x150) может быть выгодно создать один раз и сохранить его как transient transformable NSImage, вместо того, чтобы загружать большое изображение и изменять размер на лету несколько раз. Эту производительность можно легко наблюдать, прокручивая вверх и вниз таблицу, содержащую более 50 миниатюрных изображений.

person Gabe Rainbow    schedule 27.06.2013