2009-10-22 3 views
4

나는 이미지 데이터를 저장하는 여러 가지 속성이있는 여러 엔티티가 포함 된 데이터 모델을 가지고 있습니다. 이것들은 모두 작은 이미지 일 것이고 외부 파일이 아닌 영구 저장소에 저장해야합니다.Core Data 데이터 모델에서 동일한 데이터를 효율적으로 저장

이미지 데이터를 이진 또는 변형 가능 속성에 저장할 수는 있지만 사용자가 두 개 이상의 속성에 대해 동일한 이미지를 지정하므로 오히려 각 고유 이미지의 복사본 하나를 저장하는 것이 좋습니다. 이미지 데이터를 복제하는 것보다

이미지 데이터를 저장하고 관계를 사용하여이 작업을 수행하는 "ImageBlob"엔티티를 만들었지 만 핵심 데이터가있는 초보자이며이 방법이 올바른지 직접 확인하지 못합니다. 가기. 특히 다음과 같은 상황을 어떻게 처리합니까? 내 이미지 모두를 원하는

  • 각 이미지의 방울 하나의 인스턴스 만이
  • 저장되도록 내가 어떤 물체가를 사용하지 않으면 있는지 확인해야합니다 같은 "이미지 데이터 저장소"를 사용하는 여러 개체의 속성 데이터 저장소에서 제거 된 이미지

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

2

첫 번째 질문은 두 이미지가 동일한 이미지를 사용하는 시점을 어떻게 식별 할 계획입니까? 설정 한 이미지가 이미 존재하는지 여부를 확인하기 위해 저장하고 쿼리 할 수있는 이미지의 속성이 있습니까? 그리고 계산적으로 얼마나 비쌉니까? 시간이 오래 걸리는 경우 저장 용량을 최적화하고 성능에 영향을 미칠 수 있습니다.

그러나 이렇게 효율적으로 수행하는 방법이 있다면 설명하는대로 ImageBlob 엔티티를 만들 수 있습니다. ImageBlob을 사용하는 엔티티는 ImageBlobimageBlob 또는 imageBlobs 관계 여야합니다. ImageBlob은 예를 들어 users과 같은 이름과 반대의 관계를 가져야합니다.

NSManagedObject *blob = // get the image blob 
NSManagedObject *user = // get the user 
[user setValue:blob forKey:@"imageBlob"]; // do this if it uses a single image 
[[user mutableSetValueForKey:@"imageBlobs"] addObject:blob]; // do this if it uses multiple images 

당신이 생각하는 것이 좋습니다 또 다른 고려 사항이 더입니다 모양과 함께 할 것입니다 : 당신이 ImageBlob을 다시 사용하려는 코드에서는

는,이 같은 일을만큼 간단합니다 더 이상 필요합니다. 아마, 당신은 사용되지 않는 이미지를 드롭 싶어요. 이렇게하려면 NSManagedObjectContextObjectsDidChangeNotification 알림에 대해 애플리케이션 위임자 또는 NSPersistentDocument 하위 클래스 (문서 기반인지 여부에 따라)에 등록 할 수 있습니다. 관리되는 개체 컨텍스트가 변경 될 때마다,이 같은 불필요한 이미지를 삭제할 수 있습니다

- (void)managedObjectContextObjectsDidSave:(NSNotification *)notification { 
    NSManagedObjectContext *managedObjectContext = [notification object]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:[NSEntity entityWithName:@"ImageBlob" inManagedObjectContext:managedObjectContext]]; 
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 0"]; 
    NSArray *unusedBlobs = [managedObjectContext executeFetchRequest:fetchRequest error:nil]; // Don't be stupid like me; catch and handle the error 
    [fetchRequest release]; 

    for (NSManagedObject *blob in unusedBlobs) { 
     [managedObjectContext deleteObject:blob]; 
    } 
} 
+0

감사합니다. 유용한 제안입니다. 그것은 완벽한 해결책은 아니지만 나는 그 대답을 받아들입니다. –

1

당신은 당신이 단지 같은 이미지를 한 번 저장하고 있는지 확인하기 위해 Image 법인에 MD5이라는 고유 한 속성을 추가 할 수 있습니다.

핵심 데이터 항목에 대해서는 다음과 같이 생각할 수 있습니다. 그런 다음 추상 부모 엔터티 (Parent)를 만듭니다. Parent에서 Image이라는 관계를 image라고 추가하고 삭제 방법으로 "계단식"을 설정하면 Parent을 삭제할 때 Image도 삭제됩니다.Image에서 Parent 또는 parent 등의 관계를 추가하고 삭제 방법으로 "Nullify"를 설정하여 Image을 삭제하면 Parent의 이미지는 nil으로 설정됩니다. 그런 다음 다른 엔티티를 추가하고 부모를 Parent으로 설정하십시오.

관련 문제