2011-04-19 3 views
2

핵심 데이터 엔티티 중 하나에서 다른 엔티티와 일대일 관계를 맺고 있습니다. 우리 가족 엔티티가 사람과 많은 관계를 맺고 있다고 말하십시오.코레ata에 '대다수'관계의 NSSet을 저장할 수없는 이유는 무엇입니까?

가족 및 사람을 만들 수있어서 아무런 문제가 없습니다. 하지만 내가 할 때 :

self.myFamily.people = [NSSet setWithArray:myPersonArray]; 

'people'관계에 할당 된 세트가없는 것 같습니다. 저는 현재 viewcontroller에서 떨어져있는 코드를 싱글 톤으로 다시 고려 중입니다. 이 일이 그 일과 관련이있을 수 있습니까? 나는 다른 모든 객체를 저장할 수 있으며, 관리 객체를 생성하고 삭제할 수 있습니다. 객체 집합을 관계에 할당 할 수 없습니다!

답변

1

잘못된 클래스 집합을 추가하려고 시도 할 때이 오류가 발생할 가능성이 가장 높습니다. 관계에 대해 정의 된 엔터티/클래스의 개체 만 데이터 모델에 추가 할 수 있습니다. 이 같은 데이터 모델이있는 경우

그래서 :

Family{ 
    name:string 
    people<-->>Person.family 
} 

Person{ 
    name:string 
    family<<-->Family.people 
} 

을 ... 그리고 당신이 FamilyMOPersonMO의 NSManagedObject 서브 클래스가, 당신은 단지 Family.people 관계 PersonMO 개체 집합을 할당 할 수 있습니다. 이 같은 세트를 할당하려고하는 경우 :

NSSet *badSet=[NSSet setWithObjects:PersonMO1, PersonMO2, FamilyMO1, PersonMO2,nil]; 
aFamilyMO.people=badSet; 

... 그것은 실패와 IIRC, 그것은 그렇게 자동으로 할 것입니다.

+0

나는 그것을 이해했다. 이 코드를 싱글 톤으로 옮기는 과정에서 메서드를 잘못된 순서로 호출하고 있었기 때문에 함수를 호출하여 내 가족에 사람을 추가 할 때 해당 패밀리는 아직 할당되지 않았습니다.이것은 다른 모든 것들이 작동하는 이유이기도합니다. 가족이 컨텍스트에 추가 된 후에 다른 방법을 호출하고있었습니다. 그래도 런타임 오류를 예상 했었지만 다시, 나는 아무 것도 할당하지 않았다 ... 어느 것이 완벽하게 괜찮습니까 - D' oh! 나는 당신에게 침묵 오류에 표시 줄;) – dantastic

1

이것이 작동하지 않는 몇 가지 이유가 있습니다. 첫째, 개체의 초기화 프로그램에서이 작업을 수행하려고하면 값을 올바르게 설정하지 않습니다. 이니셜 라이저가 호출되면 개체가 컨텍스트에 아직 추가되지 않았으므로 값을 설정해도 아무런 효과가 없습니다. 둘째로, 애플은 대다 관계를 직접적으로 설정하는 것에 대해 조언합니다 (미안하지만이 진술에 대한 문서를 찾을 수는 없지만 너무 많이하면 작업이 멈출 수도 있습니다). 대신 동적으로 생성 된 접근자를 사용하거나 mutableSetValueForKey:에서 반환 된 값을 사용하여 자동으로 만든 변경 가능한 세트를 수정해야합니다.

[self.myFamily addPeople:[NSSet setWithArray:myPersonArray]]; 

또는

[[self.myFamily mutableSetValueForKey:@"people"] addObjectsFromArray:myPersonArray]; 

또는, 당신은 전체

[[self.myFamily mutableSetValueForKey:@"people"] setSet:[NSSet setWithArray:myPersonArray]]; 

을 설정 변경할 수 있기 때문에 개체에 의해 반환하기 때문에 대신 접근에 의해 반환 된 세트 개체의 mutableSetValueForKey:를 사용해야합니다 접근자는 KVC 알림을 호출하지 않지만 mutableSetValueForKey:의 객체는됩니다.

+0

왜 나는 이해하지 못하고 있지만 그 중 하나는 작동하지 않습니다. 그래서 나는 @property (nonatomic, retain) NSSet * people 클래스를 가진 'Family'를 가지고있다; 하지만 Set (비어있는 상태)를 설정할 수는 없습니다. 템플릿은 다음과 같은 메소드를 제공 할 정도로 친절했습니다. - (void) addPeople : (NSSet *) value {methods. 그러나 그것들을 사용하는 것은 세트를 채우는 것 같지 않습니다. 나는 할 수있는 관계를 초기화 할 필요가 있습니까? 또는 Set를 설정 한 후에 다른 작업을 수행해야합니까? 해서는 안되니? 컨텍스트를 저장하고 있지만 managedObject 객체가 이미 있으므로 사용할 준비가되어 있어야합니다. – dantastic

관련 문제