我试图通过搜索parse.com上的对象将结果过滤为searchDisplayController
。我可以成功搜索对象并使用containsString显示它们,但这不是我想要搜索对象的方式。我想使用containsAllObjectsInArray
搜索对象。我不知道我是否正确地采用这种方式,但无论如何这里是我正在尝试的代码:
- (void)filterResults:(NSString *)searchTerm {
NSCharacterSet *whitespaces = [NSCharacterSet whitespaceCharacterSet];
NSPredicate *noEmptyStrings = [NSPredicate predicateWithFormat:@"SELF != ''"];
NSArray *parts = [searchTerm componentsSeparatedByCharactersInSet:whitespaces];
NSArray *filteredArray = [parts filteredArrayUsingPredicate:noEmptyStrings];
NSLog(@" filteredArray equals %@", filteredArray);
[self.searchResults removeAllObjects];
PFQuery *query = [PFQuery queryWithClassName: @"Items"];
[query whereKeyExists:@"itemName"];
[query whereKeyExists:@"itemDescription"];
[query whereKey:@"itemName" containsAllObjectsInArray:filteredArray];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if(!error){
for (PFObject *object in objects){
NSLog(@"%@", objects);
NSLog(@"%u", objects.count);
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.searchResults removeAllObjects];
[self.searchResults addObjectsFromArray:objects];
[self.searchDisplayController.searchResultsTableView reloadData];
});
} else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
}
在我的输出中,我收到错误:
code = 102;
error = "$all only works on array fields";
我不明白为什么这不起作用,因为过滤后的数组显然是一个数组而且 已过滤的数组在输出中正确生成。
答案 0 :(得分:3)
我相信您的问题是您正在尝试搜索不是数组的字段(因为错误状态)。
whereKey:containsAllObjectsInArray:
方法意味着匹配字段(数组)包含所提供数组中所有元素的任何记录。
e.g:
Name: "Joe"
Moves: [ "Punch", "Kick", "Body Slam" ]
Name: "Jane"
Moves: [ "Punch", "Kick", "Eye Gouge" ]
使用包含“Punch”和“Kick”的数组在Moves
字段上搜索将匹配两个记录,因为两者都在其数组中有这些移动。搜索包含“Kick”和“Body Slam”的数组只会匹配Joe。
如果您想要查找包含字符串字段中单词列表的记录,则需要对数组中的每个单词执行whereKey:containsString:调用,实际上是AND查询。