使用containsAllObjectsInArray过滤结果

时间:2013-09-02 10:34:49

标签: objective-c search nsarray parse-platform

我试图通过搜索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";

我不明白为什么这不起作用,因为过滤后的数组显然是一个数组而且 已过滤的数组在输出中正确生成。

1 个答案:

答案 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查询。