2011-09-29 3 views
3

저는 여전히 NSPredicate를 사용하는 것이 처음이지만, 다소 복잡한 문제가 있습니다. 솔루션에 대한 최선의 방법은 확실하지 않습니다. .many-to-many-many 관계에 대한 NSPredicate 필터

많은 절차에서 사용할 수있는 Instrument라는 엔티티에 대한 필터를 만들려고합니다. 절차는 차례로 하나 이상의 질병과 관련이 있습니다. 질병은 많은 절차와 관련이 있으며, 도구는 둘 이상의 절차에서 사용될 수 있습니다. 즉, 내가 가진 대다 일대 다 관계를 다음

Instruments <-> Procedures <-> Diseases 

내가 뭘하고 싶은 것은 Disease.title를 사용하여 필터 악기입니다. 간단하고 마법의 세계에서,이, 나는 필터가 절차와 말할 수있을만큼 질병의 필드를 알고 있다는 것을 발견 간단하게 (약간의 오타 및 misnamings와) 작품으로이 작품을 통해 스테핑

//where predicate is used on the Instruments array 
[NSPredicate predicateWithFormat:@"(procedures.diseases.title == %@)", diseaseTitleString]; 

로 될 것이다 저 "질병 유형"은 절차 분야가 아니며 "이름"은 질병 분야가 아닙니다. Naivety는이 단순한 술어가 작동하기를 기대하면서 나를 인도했습니다.

나는 아무것도 얻지 못합니다.

(ALL procedures.diseases.title == %@)도 사용해 보았지만 작동하지 않습니다.

하위 술어에 대한 몇 가지 사항을 보았습니다. 그러나 실제로 저에게 많은 의미를 부여하는 것은 아닙니다.

은 기본적으로 내가 목록 싶어 : 나는 다른 조건을 기준으로 필터링 할 수있는 배열을 얻기 위해이 방법을 사용하고, 지금

NSArray *instruments = [[NSArray alloc] init]; 
for (Disease *disease in Diseases) { 
    if ([disease.title isEqualToString:titleString]) { 
    for (Procedure *procedure in disease.procedures) { 
     for (Instrument *instrument in procedure.instruments) { 
     if (![instruments containsObject:instrument]) { 
      [instruments addObject:instrument]; 
     } 
     } 
    } 
    } 
} 

을, 그리고 그것을 잘 작동,하지만 그것은 추한 및 더 나은, 깨끗한 방법으로 이것을 필터링 할 수있는 것처럼 느껴집니다. 누구나 NSPredicate 디자인의 미세한 사용에 대해 교육 할 수 있습니까?

답변

2

위의 조건부에서 두 개의 같음을 하나의 같음으로 대체하십시오. 또한 "ANY"절을 추가하십시오. 마지막으로 괄호를 제거하십시오. 그래서 당신은해야합니다 : 일반적으로

[NSPredicate predicateWithFormat:@"ANY procedures.diseases.title = %@", diseaseTitleString]; 

을, 나는 복잡한 조건을 처리 할 수있는 좋은 방법을 찾으 하위 술어를 사용하여 구축하는 것입니다.

 NSMutableArray *subpredicates = [NSMutableArray array]; 

그럼 당신은 당신의 subpredicates를 추가 조금씩 :

[subpredicates addObject: 
    [NSPredicate predicateWithFormat:@"ANY procedures.diseases.title = %@", 
     diseaseTitleString]] 

[subpredicates addObject:anotherPredicate etc]; 

마지막으로 만들려면 "및"또는 "또는"조건, 예를 들어 :

그래서, 당신은 시작

NSPredicate *andPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; 
+0

여기에 좋은 팁이 있지만 그 술어는 여전히 빈 배열을 반환합니다. 내 다른 하위 술어는 잘 작동하지만,이 많은 - 많은 - 많은 하나는 여전히 작동하지 않지만 위의 코드에서 루프 내장 콜렉션과 동등해야합니다. '[instrumentFilters addObject : [NSPredicate predicateWithFormat : @ "ANY procedures.diseases.title = % @", filterValue]]; 그리고 나서 다른 필터와 잘 작동하는 화합물을 만듭니다. 나는 다른 것을 놓치고 있습니까? –

+0

및 화합물없이 실행하면 어떻게됩니까? –

+0

해당 술어 (복합어 없음) 만 사용하여 필터를 실행해도 아무런 결과가 반환되지 않습니다. :( –

관련 문제