ios navigation - Как сохранить изображение в основных данных





bar title (5)


Я не знаю, почему вы хотите хранить изображение в основных данных, тогда как в iOS есть другое постоянное хранилище. Если вы хотите сохранить изображение для цели кеша, его можно сохранить в каталоге документа или в кеше. Счастливое кодирование ...

См. Ниже URL-адрес, Как сохранять и извлекать изображения в каталоге документа.

http://www.wmdeveloper.com/2010/09/save-and-load-uiimage-in-documents.html

Сохранение изображения в папке «Документы» и извлечение для вложения электронной почты

Как создать временный файл с помощью Cocoa?

Я новичок в iOS. Я пытаюсь создать приложение, которое будет хранить изображение, снятое с камеры, в CoreData . Теперь я знаю, как хранить данные типа NSString s, NSDate и другого типа, но изо всех сил NSDate сохранить изображение. Я читал так много статей, говорящих, что вы должны записать их на диск и записать в файл, но я не могу понять.

Следующий код - тот, который я использовал для хранения других данных для основных данных.

- (IBAction)submitReportButton:(id)sender
{
    UrbanRangerAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    managedObjectContext = [appDelegate managedObjectContext];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"PotholesDB" inManagedObjectContext:appDelegate.managedObjectContext];
    NSManagedObject *newPothole = [[NSManagedObject alloc]initWithEntity:entity insertIntoManagedObjectContext:managedObjectContext];


    [newPothole setValue:self.relevantBody.text forKey:@"relevantBody"];
    [newPothole setValue:self.subjectReport.text forKey:@"subjectReport"];
    [newPothole setValue:self.detailReport.text forKey:@"detailReport"];
//    [newPothole setValue:self.imageView forKey:@"photo"];

    NSDate *now = [NSDate date];
    //NSLog(@"now : %@", now);
    NSString *strDate = [[NSString alloc] initWithFormat:@"%@", now];
    NSArray *arr = [strDate componentsSeparatedByString:@" "];
    NSString *str;
    str = [arr objectAtIndex:0];
    NSLog(@"now : %@", str);

    [newPothole setValue:now forKey:@"photoDate"];
    [newPothole setValue:self.latitudeLabel.text forKey:@"latitude"];
    [newPothole setValue:self.longitudeLabel.text forKey:@"longitude"];
    [newPothole setValue:self.addressLabel.text forKey:@"streetName"];
    [newPothole setValue:streeNameLocation forKey:@"location"];


    NSError *error;
    [managedObjectContext save:&error];

    UIAlertView *ll = [[UIAlertView alloc] initWithTitle:@"Saving" message:@"Saved data" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

    [ll show];
} 



Вы можете хранить изображения в Core Data с использованием атрибута Binary Data. Однако вы должны знать о нескольких вещах:

  • Всегда конвертируйте свой UIImage в переносимый формат данных, например png или jpg. Например:

    NSData *imageData = UIImagePNGRepresentation(image);

  • Включить «Разрешить внешнее хранилище» в этом атрибуте Core Data переместит данные во внешний файл, если он достигнет определенного порога. Этот файл также полностью управляется Core Data, поэтому вам не нужно беспокоиться об этом.

  • Если вы столкнулись с проблемами производительности, попробуйте переместить атрибут Binary Data в отдельный объект.

  • Вы должны абстрагировать преобразование в NSData за интерфейсом вашего подкласса NSManagedObject, поэтому вам не нужно беспокоиться о конверсиях из UIImage в NSData или наоборот.

  • Если ваши изображения не сильно связаны с объектами в вашей модели, я бы предложил хранить их вне Core Data.




- (void)imageChanged:(UIImage*)image{

    if (self.detailItem) {
        [self.detailItem setValue:UIImagePNGRepresentation(image) forKey:kSignatureImage];
    }
}

В этом очень краткий пример. self - это контроллер представления с использованием данных ядра, а self.detailItem - обычный объект NSManagedObject. В этом проекте я не создавал классы моделей для объектов, но строго использовал шаблон KVC для доступа к атрибутам. Как вы могли догадаться, атрибут называется "signatureImage" который я определил в константе #define kSignatureImage .

Здесь изображение восстанавливается из основных данных:

self.signatureCanvas.image =  [UIImage imageWithData:[self.detailItem valueForKey:kSignatureImage]];

Опять же, self является контроллером представления, signatureCanvas является подклассом .image а .image - его обычное свойство image унаследованное от UIImageView . detailItem , опять же, является обычным NSManagedObject .

Пример берется из проекта, над которым я сейчас работаю.

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




В подклассе xcdatamodelI объявляет объект изображения как NSData ... вы не можете использовать формат UIImage , поскольку данные изображения находятся в двоичном формате.

@property (nonatomic, retain) NSData *imag;

В файле реализации .. конвертировать UIImage в NSData

UIImage *sampleimage = [UIImage imageNamed:@"sampleImage.jpg"];

NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 0.0);

Затем, наконец, сохраните его

[obj setValue:dataImage forKey:@"imageEntity"]; // obj refers to NSManagedObject



если объект содержит много записей, лучший способ - это, потому что он сохраняет память

 - (void)deleteAll:(NSManagedObjectContext *)managedObjectContext entityName:(NSString *)entityName
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [managedObjectContext setUndoManager:nil];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setIncludesPropertyValues:NO];
    [fetchRequest setFetchLimit:100]; // you can change this number if you want
    NSError *error;
    NSArray *items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    while ([items count] > 0) {
        @autoreleasepool {
            for (NSManagedObject *item in items) {
                [managedObjectContext deleteObject:item];
            }
            if (![managedObjectContext save:&error]) {
                NSLog(@"Error deleting %@ - error:%@",self.entityName, error);
            }
        }
        items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    }
}






ios objective-c core-data