2011-05-11 5 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をどのように使用しているかにも問題があります。

私はもっとこのような何かを行うことをお勧めします:

  1. 述語変数:

    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]]; 
    } 
    

    このカップルの異なるきちんとしたものを使用しています。書式文字列@"attending = $prov OR admitting = $prov OR consulting CONTAINS[cd] $prov"を一度解析し、別のプロバイダを持つたびに$provの新しい値を代入します。

  2. 複合述語の作成。 NSCompoundPredicateでいくつかのクラスメソッドを使用して、複数の述部を単一のグループ化されたORまたはAND述部に変換します。
+0

おかげさまで...ありがとうございました。 – user680891

+0

@ user680891これを聞いてうれしい!私の回答を受け入れるようにするには、上下の矢印の下にあるチェックマークをクリックします。 –

関連する問題