모범 사례? -핵심 데이터 개체 속성으로서의 배열 / 사전 [닫기]


176

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


6
주소를위한 문자열 필드를 가진 엔터티를 만드는 것은 아마도 키를 기억해야하는 사전보다 사용하기 쉬울 것입니다.
Daniel

답변:


247

Core Data에는 "기본"배열 또는 사전 유형이 없습니다. 당신은 저장할 수 있습니다 NSArray또는를 NSDictionary변형 가능한 속성으로. 이것은을 사용합니다 NSCoding에 배열 또는 사전을 직렬화 NSData속성 (액세스에 직렬화 적절하게). 이 방법의 장점은 쉽다는 것입니다. 단점은 배열이나 사전에 쿼리 할 수 ​​없으며 (데이터 저장소에 BLOB로 저장 됨) 컬렉션이 큰 경우 데이터 저장소간에 많은 데이터를 이동해야 할 수도 있습니다 (있는 경우) 컬렉션의 작은 부분을 읽거나 수정하기 위해 SQLite 데이터 저장소).

대안은 코어 데이터 대 다수 관계를 사용하여 배열 또는 사전 콜렉션의 시맨틱을 모델링하는 것입니다. 배열이 더 쉬우므로 시작하겠습니다. 핵심 데이터 대 다수 관계는 실제로 집합을 모델링하므로 배열과 같은 기능이 필요한 경우 집합을 정렬하거나 (가져온 속성을 사용하는 것이 편리한 방법 임) 엔터티에 추가 인덱스 특성을 추가해야합니다. 배열 항목을 저장하고 색인을 직접 관리합니다. 동종 배열을 저장하는 경우 (모든 항목이 동일한 유형 임) 배열 엔티티의 엔티티 설명을 쉽게 모델링 할 수 있습니다. 그렇지 않은 경우 변형 가능한 속성을 사용하여 항목 데이터를 저장하거나 항목 엔터티 제품군을 만들지 여부를 결정해야합니다.

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

이 모든 것이 약간 어리석은 것처럼 들립니다. Core Data와 같은 스키마 종속 프레임 워크에 임의의 데이터를 구호하는 것은 어렵습니다.

주소와 같은 구조화 된 데이터의 경우 엔티티를 명시 적으로 모델링하는 데 시간을 소비하는 것이 거의 항상 쉽습니다 (예 : 주소의 각 부분에 대한 속성). 사전을 모델링하는 모든 추가 코드를 피하는 것 외에도, UI가 더 쉬워지고 (바인딩은 "그냥 작동합니다") 유효성 검사 논리 등이 Core Data로 처리 될 수 있기 때문에 훨씬 명확 해집니다.

최신 정보

OS X 10.7부터 Core Data에는 배열 대신 사용할 수있는 순서 집합 유형이 포함되어 있습니다. 10.7 이상을 대상으로 할 수있는 경우이 방법은 정렬 된 (배열 형) 컬렉션에 가장 적합한 솔루션입니다.


둘째-이미 생각한 것을 확인했지만 변형 가능한 속성에 대해서는 몰랐습니다.
jkp

3
@pixelfreak 변형 가능의 사용은 컬렉션의 아이템 을 어떻게 사용해야하는지에 달려 있습니다. 이들에 대해 쿼리해야하거나 일부 또는 전부를 느리게로드하려는 경우 변환 가능한 속성이 작동하지 않습니다. 로드 지연이 필요하지 않고 쿼리 할 필요가없고 항상 모든 항목이 필요 하거나 전혀 필요하지 않은 경우 변환 가능한 속성이 작동 할 수 있습니다 (구현하기 쉽습니다).
Barry Wark

3
Barry의 말은 핵심 데이터 프로그래밍 안내서의 비표준 지속 속성 장에 자세히 설명되어 있습니다.
Palimondo

2
정렬 된 세트에 대한주의 사항 : 여러면에있는 2 천 개 이상의 물체와 많은 관계를 맺는 데 사용하지 마십시오. 그렇게하면 저장이 스레드를 차단하는 데 시간이 오래 걸릴 수 있습니다.
Kirk van Gorkom 2016 년

2
나는 "새로운 주문 세트"에 대해 이해하지 못한다. 속성입니까? 속성 유형 메뉴에서 볼 수 없기 때문입니다.
줄거리

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을 Core Data Managed Object Model의 속성 유형으로 사용하고 있습니다.

이 코드를 init 메소드 내의 AppointmentSearchResponse.m 안에 넣었습니까?
Chicowitz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.