2011-05-15 3 views
3

코어 데이터를 사용하고 있습니다. 직원과 부서가 다 대 일 관계에 있고 직원이 각 부서의 NSSet에 저장되어 있다고 가정 해 보겠습니다. 직원 한 명만있는 부서를 모두 찾고 싶습니다. 핵심 데이터를 어떻게 처리합니까?NSPredicate를 사용하여 하위 요소를 기준으로 필터링하는 방법은 무엇입니까?

나는 아래 코드를 시도했지만 MYEmployee가 allObjects에 응답하지 않는다는 예외가 발생했습니다. 당신은 항상 데이터 저장소에서 모든 부서를 가져 오는 다음 메모리에 결과 배열을 필터링하고 있기 때문에 우선

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF.employees.allObjects.count == 1"]; 
singleEmployeeDepartments = [[myModelController allDepartments] filteredArrayUsingPredicate:predicate]]; 
+0

위의 코드 블록은 모두 한 줄입니다. singleEmployeeDepartments로 다음 줄을 시작하려고하면 코드 Markdown이 나옵니다. 뭐라 구요? –

+0

백틱은 인라인 코드 형식에만 사용됩니다. 여러 줄 코드 블록의 경우 각 줄을 4 칸 들여 쓰기하십시오. 텍스트를 선택하고 편집 필드 또는 Control-K 위에있는 {}을 누르십시오. –

답변

7

, 당신은, 효율적으로 여기에 코어 데이터를 사용하지 않는. 모든 부서를 가져 오는 대신 일치하는 부서에 대해 관리되는 개체 컨텍스트를 직접 쿼리 할 수 ​​있으므로 메모리 사용량을 줄일 수 있으며 많은 부서가있는 경우 더 빠를 수도 있습니다.

NSManagedObjectContext *moc = ...; 
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:[NSEntityDescription entityForName:@"Department" inManagedObjectContext:moc]]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 1"]]; 
NSArray *singleEmployeeDepartments = [moc executeFetchRequest:request error:NULL]; 

다른 중요한 부분은 직원의 특정 번호를 가지고 부서를 조회 할 조건 문자열의 @count 연산자를 사용하는 것입니다.

+0

고마워요, 효과가있어, 고마워요. 그래도 이미 다른 목적을 위해 전체 배열을 쿼리해야합니다. 또한 NSSet은 count에 응답하지 않았지만 NSPredicate에 있고 작동하는 집계 함수이기 때문에 추측했습니다. –

+0

빠른 질문 : @count는 어디에 문서화되어 있습니까? 여기서는 간접적으로 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-CJBDBHCB에서 사용됩니다. – mxb

관련 문제