2012-08-26 3 views
0

나는 다음과 같은 모델을 그래프이 : 나는 목록을 항목의 목록을 표시 오전 jQuery과에서코어 데이터가 일대일 관계를 통해 요청 술어 필터링을 가져

    +-----------+  +-----------+ 
        | Container |  | Group | 
        +-----------+  +-----------+ 
        | groups |<-->>| container | 
        +-----------+  +-----------+ 
         ^    ^
         |     | 
+-----------+  +-----------+  +-----------+  +---------+ 
| Owner |  | ToyBox |  | ToyType |  | Item | 
+-----------+  +-----------+  +-----------+  +---------+ 
| toyBox |<--->| owner |  | items |<-->>| toyType | 
+-----------+  +-----------+  +-----------+  +---------+ 

합니다. 이 경우 특정 소유자에게 속한 항목 만 표시하려고합니다. 이렇게하려면 NSFetchedResultsController를 사용하여 항목을 표시합니다. 이것은 NSFetchedResultsController에게 줄 적절한 NSPredicate로 NSFetchRequest를 생성해야한다는 것을 의미합니다.

keypath 조건자를 사용하면 상위 엔티티로 인해 예외가 발생합니다. 이것은 Apple 버그이거나 지원하지 않기로 결정한 것 같습니다. 레이다가 접수되었습니다. 또한 엔티티를 병합하지 않으려합니다. 이것은 다음과 같은 예외가 발생

NSFetchRequest *itemsFetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Item"]; 
NSPredicate *itemsPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(toyItem, $g, SUBQUERY($g.container, $c, SUBQUERY($c.owner, $o, $o = %@)[email protected] > 0)[email protected] > 0)[email protected] > 0", ownerObject]; 

:

그래서 다음과 같이 하위 쿼리와 함께이 작업을 수행하기 위해() 나를 남겨 그

Can't have a non-relationship collection element in a subquerySUBQUERY($c.owner, $o, $o == <MLMOOwner: ... 

내가 실현 관계가 하나이기 때문에 그 소유자와 ToyBox 사이에 컬렉션이 반환되지 않았으며 이것이 문제입니다. 그래서 내 질문은 :

1) 하위 쿼리에서 1 대 1 관계의 컬렉션을 강제로 반환하는 방법이 있습니까?
2) 가져 오기 요청에 대해이 술어를 작성하는 다른 방법이 있습니까?

답변

2

원하는 작업을 훨씬 더 쉽게 수행 할 수 있어야합니다. 주어진 소유자와 함께 모든 항목을 원하면 소유자와 함께 시작하고 키 경로를 사용하여 연관된 항목을 가져옵니다. 술어는 필요하지 않습니다. 10 개 항아리 항아리가 있고 2 항의 땅콩을 꺼내고 싶다면 모든 땅콩 세트로 시작하지 말고 항아리에 따라 걸러 낼 수 있습니까? 먼저 항아리 2를 가져다가 땅콩을 봅니다. 이렇게 :

NSSet *groups = [ownerObject valueForKeyPath:@"toyBox.groups"]; 

그러면 모든 그룹이 ownerObject에 속합니다. Group 엔터티에 items 특성이 없으므로 단일 키 경로를 사용하여 모든 항목을 가져올 수 없습니다. Groupitems 접근자를 지정하면 빈 세트 만 반환한다고해도 쉽게 접근 할 수 있습니다. 즉,이 작업을 수행 할 것입니다 :

NSSet *items = [ownerObject valueForKeyPath:@"toyBox.groups.items"]; 

당신이 Groupitems 속성을 추가하지 않으려면, 당신은 ToyType 단지 그 객체를 선택하는 첫 번째 예제에서 설정 groups를 필터링해야합니다 사물. 그런 다음 해당 세트의 키 경로 @"items"을 사용하여 원하는 항목 목록을 가져올 수 있습니다.

엔티티 상속에주의해야합니다. 당신은 방금 그것이 조금 더 복잡한 것을 가져 오는 것을 어떻게 만들 수 있는지 보았습니다. 또한 데이터가 저장되는 방식, 즉 all instances of sub-entities are stored in the same table에 영향을 미칩니다. 예를 들어 Group (예 : ToyType)에서 파생 된 개체가 12 개있는 경우 해당 개체의 모든 인스턴스가 함께 저장됩니다.

+0

당신은 심지어 자기를 떠날 수 있습니다. 아웃. –

+0

@Scott 좋은 지적입니다. – Caleb

+0

@Caleb 피드백에 감사드립니다. 필자가 구현 한 첫 번째 방법은 keypath 방식이었으며 예외도있었습니다. 방금 다시 시도해 보니 다음과 같이 되돌아옵니다 :'keypath group.container. 엔티티에 소유자가 없습니다. –

관련 문제