0

所以我有 4 个文本字段,用户可以在其中缩小表格结果的范围,以便找到确切的位置。我的问题是,由于用户不必在每个文本字段中输入内容,我不能简单地AND在谓词中使用。

现在,我的应用程序与我的应用程序相反。如果一个类型在一个城市和一个州,我的谓词显示更多的结果而不是缩小结果。这完全解释了它为什么这样做。

除了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 回答