2011-05-11 3 views
0

predicateWithFormat을 호출하지 않고 사전 형식화 된 문자열에서 직접 nspredicate를 작성하는 방법이 있습니까? 마지막 문자열과 같이 보일 것이다 :미리 작성된 문자열을 사용하여 조건부 작성

(inpatient=1) AND (dischargedate!=<null>) AND ((attending=SMITH) OR (admitting=SMITH) OR (consulting contains[cd] SMITH) OR (attending=JONES) OR (admitting=JONES) OR (consulting contains[cd] JONES))

NSMutableString *preds = [[NSMutableString alloc] initWithString:@""]; 

    NSArray *provs = [self.providerCode componentsSeparatedByString:@"|"]; 
    for (NSString *prov in provs) { 
     [preds appendFormat:@" (attending=%@) OR (admitting=%@) OR (consulting contains[cd] %@) ", prov, prov, prov]; 
    } 
    NSString *final = [NSString stringWithFormat:@"(inpatient=%@) AND (dischargedate!=%@) AND (%@)", [NSNumber numberWithBool: self.inpatients], [NSNull null], preds]; 

    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:final]]; 

답변

0

예 당신이 할 수있는,하지만 당신은 약간 형식 문자열을 수정해야합니다. 대신 일을

:

[preds appendFormat:@" (attending = %@)", prov]; 

당신이해야 할 것 :

[preds appendFormat:@" (attending = '%@')", prov]; 

참고 %@ 수정의 주위에 작은 따옴표를 사용. 그것은 술어가 그것이 일정한 가치임을 알 수있는 방법입니다.

그러나이 경로를 사용하더라도 여전히 피해야하는 것으로 보이는 predicateWithFormat:을 사용하여 문제가 있습니다. 형식 문자열에 NSNull을 사용하는 방법에 문제가있을 수 있습니다.

좀 더 이런 일을 추천 할 것입니다 : 이것은 몇 가지 멋진 기능을 사용

NSArray *provs = [self.providerCode componentsSeparatedByString:@"|"]; 

NSMutableArray *providerPredicates = [NSMutableArray array]; 
NSPredicate *template = [NSPredicate predicateWithFormat:@"attending = $prov OR admitting = $prov OR consulting CONTAINS[cd] $prov"]; 
for (NSString *prov in provs) { 
    NSDictionary *substitutions = [NSDictionary dictionaryWithObject:prov forKey:@"prov"]; 
    NSPredicate *p = [template predicateWithSubstitutionVariables:substitutions]; 
    [providerPredicates addObject:p]; 
} 

NSPredicate *final = [NSPredicate predicateWithFormat:@"inpatient = 1 AND dischargedate != nil"]; 

if ([providerPredicates count] > 0) { 
    NSPredicate *providers = nil; 
    if ([providerPredicates count] > 1) { 
    providers = [NSCompoundPredicate orPredicateWithSubpredicates:providerPredicates]; 
    } else { 
    providers = [providerPredicates objectAtIndex:0]; 
    } 

    final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:final, providers, nil]]; 
} 

:

  1. 술어 변수. 형식 문자열 @"attending = $prov OR admitting = $prov OR consulting CONTAINS[cd] $prov"을 한 번 구문 분석 한 다음 다른 공급자가있을 때마다 $prov의 새 값으로 대체하십시오.
  2. 복합 술어 작성. 하나의 그룹화 된 OR 또는 AND 술어로 여러 술어를 변환하려면 NSCompoundPredicate에 몇 가지 클래스 메소드를 사용하십시오.
+0

데이브 감사합니다 ... 당신의 솔루션은 훌륭했습니다 !! – user680891

+0

@ user680891 듣기 좋습니다! 내 대답을 승인 된 것으로 표시하려면 위쪽/아래쪽 화살표를 클릭하십시오. –

관련 문제