ProgramingTip

핵심 데이터에 이미지를 저장하는 방법

bestdevel 2020. 10. 28. 20:21
반응형

핵심 데이터에 이미지를 저장하는 방법


iOS를 처음 사용합니다. .NET Framework에 저장하는 응용 프로그램을 만들려고했습니다 CoreData. 이제 NSStringS 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];
} 

Binary Data 속성 유형을 사용하여 Core Data에 이미지를 사용할 수 있습니다. 그러나 몇 가지 사항에 유의해야합니다.

  • 항상 UIImage를 png 또는 jpg와 같은 새로운 데이터 형식으로 변환하십시오. 예 :

    NSData *imageData = UIImagePNGRepresentation(image);

  • 이 속성에서 "외부 저장소 허용"을 활성화합니다. 기술핵심 데이터는 특정 임계 값에 도달하면 데이터를 외부 파일로 이동합니다. 이 파일은 완벽하게 관리 할 필요가 없습니다.

  • 이진 데이터 속성을 별도의 엔터티로 이동해 발생하면 성능 문제가 발생합니다.

  • NSManagedObject 하위 클래스의 인터페이스에서 NSData 로의 변환을 추상화해야 UIImage에서 NSData로 또는 그 뒤 변환에 대해 걱정할 필요가 없습니다.

  • 이미지가 모델의 경우와 한 관련이없는 경우 Core Data 외부에 저장하는 것이 좋습니다.


xcdatamodelId 하위 클래스에서 이미지를 NSData... 로 선언 UIImage합니다. 이미지 데이터가 이진 형식을 사용할 수 없습니다 .

@property (nonatomic, retain) NSData *imag;

구현 파일에서 .. 변환 UIImageNSData

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

NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 0.0);

마지막으로 저장

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

- (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보기 컨트롤러이며, signatureCanvasA 는 서브 UIImageView클래스와 .imageimage규칙적 상속 된 속성 UIImageView. detailItem다시, 평소 NSManagedObject입니다.

이 예제는 현재 작업중 인 프로젝트에서 것입니다.

핵심 데이터에 이미지와 같은 대용량 데이터 개체를 저장하거나 파일로 분리하는 데는 장단점이 있습니다. 파일에 저장한다는 것은 관련 데이터 개체가 삭제 될 때 삭제해야한다는 것을 의미합니다. 이는 코딩 오버 헤드를 제공하고 프로그래밍 오류로 인해 불안정 할 수 있습니다. 반면에 기본 데이터베이스 속도가 느려질 수 있습니다. 성능과 관련하여 공유 할 수있는이 접근 방식에 대한 경험이 아직 충분하지 않습니다. 결국 차지하는 디스크 스토리지는 총 크기가 거의 같습니다.


대한 스위프트 5스위프트 4.2

  1. 변환 UIImage합니다 Data:

    let imageData = image.jpegData(compressionQuality: 1.0)
    
  2. 저장 CoreData:

    let object = MyEntity(context: managedContext)   //create object of type MyEntity
    object.image = imageData                         //add image to object
    
    do {
        try managedContext.save()                   //save object to CoreData
    } catch let error as NSError {
        print("\(error), \(error.userInfo)")
    }
    

이 문제를 해결하는 데 도움이 될 수있는 몇 가지 링크

https://stackoverflow.com/a/3909082/558000

CoreData에서 UIImage 저장 및 검색

http://ootips.org/yonat/uiimage-in-coredata/


Core Data의 이미지를 UIImage로 저장할 수 있습니다. 데이터베이스는 파일 저장을위한 것이 아니기 때문에 이것은 좋은 방법으로 간주되지는 않습니다. 핵심 데이터를 사용하여 이미지를 직접 저장하지 않고 대신 이미지 데이터가 휴대 전화에 저장되는 파일 경로를 사용합니다.

어쨌든 사이드 프로젝트를 개발하면서 찾은 최고의 방법은 다음과 같습니다.

  1. 엔티티 codeGen을 수동 / 없음으로 설정합니다.

  2. 이미지 유형이 될 속성을 선택하고 유형으로 변환 가능선택하십시오.

  3. 사용자 정의 클래스 식별자를 UIImage로 입력하십시오.

  4. 편집기로 이동하여 NSManagedObject 하위 클래스 만들기를 선택합니다.

  5. 프로세스는 엔티티 수에 따라 2 개의 신속한 파일을 생성합니다 (엔티티가 1 개뿐입니다). 이제 <EntityName> + CoreDataProperties.swift파일을 선택하고 UIKit을 가져옵니다.

@NSManaged 공용 변수에 대한 정의이동을 클릭하면 UIImage definition작업이 완료된 것입니다.

원하는대로 엔티티에 대한 작업을 수행하면 다운 캐스팅하여 이미지 속성을 가져오고, 저장하고, 편집 할 수 있습니다 <EntityName>?.value(forKey: "<attributeName>") as? UIImage.

엔티티를 NSManagedObject유형 으로 사용해야했고 어떤 이유로 생성 된 하위 클래스에서 직접 이미지에 액세스 할 수 없었습니다.


iOS에서 사용할 수있는 다른 영구 저장소가있는 동안 핵심 데이터에 이미지를 저장하려는 이유를 모르겠습니다. 캐시 목적으로 이미지를 저장하려는 경우 문서 디렉토리 또는 캐시 디렉토리에 저장할 수 있습니다. 해피 코딩 ...

아래 URL, 문서 디렉토리에 이미지를 저장하고 검색하는 방법을 참조하십시오.

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

문서 디렉토리에 이미지 저장 및 이메일 첨부 파일 검색

Cocoa로 임시 파일을 어떻게 만드나요?

참고 URL : https://stackoverflow.com/questions/16685812/how-to-store-an-image-in-core-data

반응형