Objective c 谓词的语法应该是什么样的,它应该根据4个文本字段缩小表结果的范围?

Objective c 谓词的语法应该是什么样的,它应该根据4个文本字段缩小表结果的范围?,objective-c,core-data,predicate,Objective C,Core Data,Predicate,因此,我有4个文本字段,用户可以使用这些字段缩小表格结果的范围,以便找到准确的位置。我的问题是,由于用户不必在每个文本字段中键入内容,因此我不能在谓词中简单地使用和 现在,我的应用程序与我所希望的正好相反。如果在一个城市和一个州中键入,我的谓词将显示更多结果,而不是缩小结果范围。这就解释了为什么它会这样做 除了根据哪些文本字段为空或不为空创建许多if语句外,还有更好的解决方法吗 NSPredicate *predicate = [NSPredicate predicateWithForma

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

现在,我的应用程序与我所希望的正好相反。如果在一个城市和一个州中键入,我的谓词将显示更多结果,而不是缩小结果范围。这就解释了为什么它会这样做

除了根据哪些文本字段为空或不为空创建许多
if
语句外,还有更好的解决方法吗

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

我想这就是你想要的:

 [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];
这应该起作用:

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
之间可能存在不匹配。它应该是
名称
<代码>用户位置

您正在搜索的数据的结构是什么?它是一个包含用户名、城市等的字符串,还是一组字典,或者其他什么?我使用的是核心数据。我的NSFetchedResultsController搜索我的属性。因此,我将在“city”属性中查找输入“userCity”。我希望这回答了你的问题。@rdelmar:你当然是对的(谢谢),编辑。-我再也不确定是否有必要对空字段进行测试,但我只能在以后再次访问我的计算机时进行测试。是的,我错了。我刚修好。谢谢你的帮助:)