0

したがって、正確な場所を見つけるために、ユーザーがテーブルの結果を絞り込むために使用できる 4 つのテキスト フィールドがあります。私の問題は、ユーザーが各テキスト フィールドに何かを入力する必要がないため、単純ANDに述語で使用できないことです。

今、私は自分のアプリにやりたいこととは反対のことをしています。City と State を入力すると、述語は結果を絞り込むのではなく、より多くの結果を表示します。これは、なぜそれを行うのかについて完全に理にかなっています。

ifどのテキストフィールドが空かどうかに基づいて多くのステートメントを作成する以外に、これを回避するより良い方法はありますか?

   NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(place CONTAINS[c] %@) OR (city CONTAINS[c] %@) OR (state CONTAINS[c] %@) OR (zip CONTAINS[c] %@)",
                              userPlace, userCity, userState, userZip];
4

2 に答える 2

1

これはうまくいくはずです:

fetchRequest.predicate = nil;
NSMutableSting *predicateString = [NSMutableString string];
NSArray *attributeNames = @[@"name", @"city", @"state", @"zip"];
int i = 0; 
for (NSString *s in @[userName, userCity, userState, userZip]) {
   if (s && ![s isEqualToString:@""]) {
      [predicateString appendFormat:@"%@", 
          predicateString.length ? @" AND " : @""];
      [predicateString appendFormat:@"(%@ CONTAINS[c] '%@')", 
          attributeNames[i], s];
   }
   i++;
}
if (predicateString.length) { 
   fetchRequest.predicate = [NSPredicate predicateWithFormat:predicateString];
}

これを行う「適切な」方法は、複合述語を使用することですが、これはさらに冗長になります。

placeまた、属性と置換変数の間の例で不一致の可能性があることに気付きましたuserName。それはすべきnameですか?userPlace?

于 2012-11-02T11:58:27.443 に答える
0

これがあなたが望むものだと思います:

 [NSPredicate predicateWithFormat:@"(%@ = \"\" OR place CONTAINS[c] %@) AND (%@ = \"\" OR city CONTAINS[c] %@) AND (%@ = \"\" OR state CONTAINS[c] %@) AND (%@ = \"\" OR zip CONTAINS[c] %@)",
                          userName, userName, userCity, userCity, userState, userState, userZip, userZip];
于 2012-11-01T22:38:48.623 に答える