2009-09-23 2 views
1

: 세트에있는 기존의 모든 항목을 대체코어 데이터 추가 [ttt] 대 집합 [ttt] - 다 대다 관계의 차이? 일대 다 관계로

@interface Department (CoreDataGeneratedAccessors) 
- (void)addEmployeeObject:(Employee *)value; 
- (void)removeEmployeeObject:(Employee *)value; 
- (void)addEmployees:(NSSet *)value; 
- (void)remove Employees:(NSSet *)value; 
@end 

겠습니까 'addEmployees'을하거나 기존 목록에 추가합니다 다음 xcdatamodel에서 생성 된 클래스는 것인가?

애플의 CoreData 프로그래밍 가이드에서는 "일대일 관계와 같은 방식으로 전체 일대 다 관계를 조작 할"수 있고 이 아닌 'setEmployees'를 사용하여이를 보여줍니다. 생성 된 클래스는 'addEmployees'입니다. 있다.

NSSet *newEmployees = [NSSet setWithObjects:employee1, employee2, nil]; 
[aDepartment setEmployees:newEmployees]; 

NSSet *newDirectReports = [NSSet setWithObjects:employee3, employee4, nil]; 
manager.directReports = newDirectReports; 

// for adding single elements 
NSMutableSet *employees = [aDepartment mutableSetValueForKey:@"employees"]; 
[employees addObject:newEmployee]; 
[employees removeObject:firedEmployee]; 
// or 
[aDepartment addEmployeesObject:newEmployee]; 
[aDepartment removeEmployeesObject:firedEmployee]; 

답변

1

일을 명확히하기 위해 : 인터페이스의 모든 메소드는 모두 다 대다 관계를 참조하기 때문에 집합 연산을 수행합니다. addEmployeeObject :와 addEmployees :의 차이점은 전자가 단일 객체를 추가하는 반면에 후자는 동시에 많은 객체를 추가한다는 것입니다. 이 경우 set 작업은 union을 설정하고 removeEmployeeObject : 및 removeEmployees의 경우에는 물론 차이가 설정됩니다.

왜 이미 저장되어있는 이전 컬렉션에 추가하는 측면에서 생각하면 안됩니까? 핵심 데이터는 NSCountedSet (중복 요소를 포함 할 수있는 집합, 가방이라고도 함)이 아닌 NSSet (별개 요소 집합)을 사용하여 다 대 관계를 나타 내기 때문입니다. 그리고 세트는 정렬되지 않은 콜렉션이므로 "appending"은 의미가 없습니다 (배열이나리스트 대신 사용). 핵심 데이터 (올바르게)는 동일한 일대 다 관계에 저장된 반복 요소를 허용하지 않으므로 프레임 워크는 고유 요소를 적용하는 NSSet을 사용합니다 (NSCountedSet은 중복 요소를 허용 함).

마지막으로 setEmployees : 메소드를 사용하면 일대 다 관계에 저장된 현재 직원 세트를 해제하고 인수로 전달한 세트를 setEmployees : 메소드에 유지합니다. 따라서 관계에 저장된 요소를 한 번 변경합니다. 관계에 저장된 모든 요소를 ​​먼저 제거한 다음 새 요소를 추가하는 것과 완전히 동일합니다 (물론 모든 요소가 고유하다고 가정 할 경우).

0

은 'addEmployee'는 세트의 모든 기존 제품을 대체겠습니까 아니면 기존 목록에 추가됩니다?

Department Di의 Employee 관계의 원래 세트는 각각 추가하는 것과 비어 있거나 연결되지 않은 경우를 제외하고는, 아마도 둘, NSSet*지지 않습니다 때문입니다. 이러한 코어 데이터 방법은 배열 조작이 아닌 set operations을 수행한다고 생각하십시오.

작은 이름 외에, 명명 규칙은 복수형 형태의 Entity 명사와 이름을 짓는 것입니다. 즉, employeeemployees으로 변경할 수 있습니다. 이것은 당신의 방법과 핵심 데이터 모델을 바라 보는 다른 사람들에게 더 이해 될 것입니다.

+0

설정 항목 비교를 통해 세트의 특정 객체의 값 또는 참조를 기준으로 연결이 끊어 졌는지 여부를 확인할 수 있습니까? –

+0

'-isEqual :'메소드는'-hash' 메소드의 결과를 두 관리 객체 모두에서 비교한다고 생각합니다. '-hash'의 정의는'NSObject'를보십시오 : http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/hash –

+0

내가 쓴 것은 실제로 대답이 아닌 것처럼 보입니다. MO에 서로 다른 참조가있는 경우 서로 다른 해시 결과가있을 수 있습니다. 그래도이 질문을 테스트하기는 쉽다. –

관련 문제