2009-10-13 4 views
169

저는 Core Data를 처음 사용합니다. 컬렉션 유형을 속성 유형으로 사용할 수없고 가장 효율적인 방법이 배열/사전 형식 데이터를 특성으로 저장하는 것 (예 : 거리, 도시 등과 같은 주소를 구성하는 요소)이 무엇인지 알고 싶습니다. 별도의 엔티티가 필요 없으며 별도의 속성/필드보다 사전/배열로 더 편리하게 저장됩니다. 고맙습니다.모범 사례? - 코어 데이터 엔티티 속성으로 배열/사전

+5

주소에 대한 문자열 필드가있는 엔티티를 만드는 것은 키를 기억해야하는 사전보다 사용하기가 쉽습니다 ... – Daniel

답변

238

코어 데이터에는 "기본"배열이나 사전 형식이 없습니다. 변형 가능한 속성으로 NSArray 또는 NSDictionary을 저장할 수 있습니다. 그러면 NSCoding을 사용하여 배열이나 사전을 NSData 속성으로 직렬화하고 액세스 할 때 적절하게 역 직렬화합니다. 이 방법의 장점은 쉽다는 것입니다. 단점은 배열이나 사전 (데이터 저장소에 BLOB로 저장 됨)에 쿼리 할 수없고 컬렉션이 큰 경우 많은 데이터를 데이터 저장소로 /에서 이동해야 할 수도 있다는 것입니다 (SQLite 데이터 저장소) 컬렉션의 일부만 읽거나 수정할 수 있습니다.

다른 방법으로 코어 데이터 일대 다 관계를 사용하여 배열 또는 사전 컬렉션의 의미를 모델링 할 수 있습니다. 배열은 더 쉽기 때문에 그렇게 시작할 수 있습니다. 코어 데이터 일대 다 관계는 실제로 집합을 모델링하기 때문에 배열과 같은 기능이 필요하면 집합을 정렬하거나 (가져온 속성을 사용하는 것이 편리한 방법입니다) 엔티티에 추가 색인 속성을 추가해야합니다 배열 항목을 저장하고 색인을 직접 관리합니다. 균질 배열 (모든 항목이 같은 유형)을 저장하는 경우 배열 엔터티에 대한 엔터티 설명을 쉽게 모델링 할 수 있습니다. 그렇지 않은 경우 변형 가능한 속성을 사용하여 항목 데이터를 저장할지 아니면 항목 엔터티 집합을 만들지 결정해야합니다.

사전을 모델링하려면 키와 값을 저장하는 엔티티 집합에 일대일 관계가 필요할 것입니다. 키와 값은 위에 설명 된 배열의 항목 엔티티와 유사합니다. 따라서 네이티브 형식 (미리 알고있는 경우), 변형 가능한 특성 또는 형식 관련 엔터티 제품군의 인스턴스에 대한 관계 일 수 있습니다.

이 모든 것이 약간 어려운 것처럼 들리면 그렇습니다. 코어 데이터와 같은 스키마 종속 프레임 워크에 임의의 데이터를 저장하는 것은 어렵습니다.

주소와 같은 구조화 된 데이터의 경우 엔 엔티티를 명시 적으로 모델링하는 시간 (예 : 주소의 각 부분에 대한 속성)을 사용하는 것이 거의 항상 쉽습니다. 사전을 모델링하는 데 필요한 모든 추가 코드를 피하는 것 외에도 UI 데이터를 더 쉽게 만들 수 있으며 (바인딩은 "효과가 있습니다") 유효성 검사 로직 등은 Core Data에서 처리 할 수 ​​있으므로 훨씬 명확합니다.

업데이트

OS X 10.7 같이, 코어 데이터 배열 대신에 사용될 수있는 정렬 된 세트의 유형을 포함한다. 10.7 이상을 타겟팅 할 수 있다면 주문한 (배열과 유사한) 컬렉션에 가장 적합한 솔루션입니다.

+0

Seconded - 이미 생각한 바를 확인했지만 변환 가능한 속성에 대해서는 몰랐습니다. – jkp

+0

@ 배리 그럼 궁금한데, 언제 "올바른"시간을 사용할 수있는 transformable? 내 엔티티에 문자열 배열이 있고 배열에 100 개 이상의 항목이없고 문자열이 평균 영어 단어 인 경우 transformable을 사용할 수 있습니까? – pixelfreak

+3

@pixelfreak transformable 사용은 컬렉션의 항목을 사용해야하는 * 방법 *에 달려 있습니다. 그들에 대해 질의를해야하거나, 그것들 중 일부 또는 전부를 느리게로드하고 싶다면 변형 가능한 속성은 작동하지 않을 것이다. 게으른로드가 필요하지 않은 경우 질의를 할 필요가 없으며 항목의 * all *을 필요로하지 않거나 아무 것도 필요하지 않습니다. 변환 가능한 속성이 작동 할 수 있습니다 (구현하기가 쉽습니다). –

11

비슷한 문제가 있습니다. 필자의 경우에는 문자열 배열을 매핑하려고했습니다. 나는 Barry의 충고에 따라 마침내 작동하게 만들었다. 다음은 코드의 일부입니다 (이 코드가 실행되는 다른 모든 사람들에게 유용 할 것입니다).

내 법인과 같은 :

@interface AppointmentSearchResponse : NSManagedObject 
@property (nonatomic, retain) NSSet *messages; 
@end 

개체 모델 코드 (코어 데이터) 코드는 다음과 같이 보입니다 관리 제 :

NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init]; 
[entityDescription setName:@"AppointmentSearchResponse"]; 
[entityDescription setManagedObjectClassName:@"AppointmentSearchResponse"]; 

NSMutableArray *appointmentSearchResponseProperties = [NSMutableArray array]; 
NSAttributeDescription *messageType = [[NSAttributeDescription alloc] init];  
[messageType setName:@"messages"]; 
[messageType setAttributeType:NSTransformableAttributeType]; 
[appointmentSearchResponseProperties addObject:messageType]; 

[entityDescription setProperties:appointmentSearchResponseProperties]; 

그래서 여기에 주요 항목은 다음과 같습니다

  • 속성 유형에 NSSet을 사용하고 있습니다.
  • NSTransformableAttributeType을 핵심 데이터 관리 객체 모델의 속성 유형으로 사용하고 있습니다.
+0

그래서이 코드를 AppointmentSearchResponse.m 안에 init 메소드 안에 넣었습니까? – Chicowitz