PFQuery对一个键有多个约束

时间:2015-07-12 21:22:08

标签: ios iphone parse-platform

我有parse.com数据库。我在名为“text”的表中有列。 我必须找到具有与AND条件匹配的多个键的文本。 我尝试了各方面。我试图使用:

    PFQuery *query=[PFQuery queryWithClassName:@"post"];
    [query whereKey:@"text" containedIn:Array];

    PFQuery *query=[PFQuery queryWithClassName:@"post"];
    [query whereKey:@"text" containsAllObjectsInArray:Array];        

PFQuery *query=[PFQuery queryWithClassName:@"post"];
for (NSString *str in filtersArray) {

    [query whereKey:@"text" containsString:str];

}

但没人工作。如果解析s​​dks支持或不支持,请指导我吗?如果是,我怎样才能达到效果。 非常感谢提前:))

EIDT:

例如我在数据库中有三个条目作为文本:

  1. “我有一个数据条目”

  2. “我在数据中找不到内容”

  3. “我该怎么做”

  4. 如果通过“i”和“this”它应该返回条目(3)

    如果传递“i”和“data”,则应返回条目(1,2)

    如果传递“i”和“else”则不返回任何内容

4 个答案:

答案 0 :(得分:2)

您的查询不起作用的原因是因为Parse不支持在同一个键上多次使用相同的约束(在本例中为'containsString:')。

所以,我建议查询一个正则表达式,它将使用- (instancetype)whereKey:(NSString *)key matchesRegex:(NSString *)regex匹配所有过滤字符串。

NSArray *qryStrings = @[str1, str2, str3, ....]; //strings you are trying to match

//string which will hold our regular expression
NSString *regexString = @"^"; //start off the regex

for (NSString *str in qryStrings) { //build the regex one filter at a time
    regexString = [NSString stringWithFormat:@"%@(?=.*%@)", regexString, str];
}

regexString = [NSString stringWithFormat:@"%@.*$", regexString]; //finish off the regex

PFQuery *query = [PFQuery queryWithClassName:@"post"];
[query whereKey:@"text" matchesRegex:regexString];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        //objects array contains matching rows with matching strings
    }
    else {
        NSLog(@"%@ %@", error, [error userInfo]);
    }
}];

答案 1 :(得分:0)

根据查询的速度要求和被查询的对象数量,我会尝试使用componentsSeparatedByString:在使用类似for(NSString *string in results)之类的枚举结果数组后使用if(...)分隔结果。将每个字符串分成单个数组后,使用NSMutableArray *searchResults = [[NSMutableArray alloc] init]; PFQuery *query=[PFQuery queryWithClassName:@"post"]; // consider setting a limit, depending on the number of posts // consider sorting the query as needed NSArray *posts = [query findObjects]; for(NSString *text in posts) { NSArray *words = [text componentsSeparatedByString:@" "]; // use SeperatedByCharactersInSet: for . , or anything else you'd need switch ([filterArray count]) { case 1: if([words containsObject:filterArray[0]]) { [searchResults addObject:text]; } break; case 2: if([words containsObject:filterArray[0]] && [words containsObject:filterArray[1]]) { [searchResults addObject:text]; } break; // case n: // if([words containsObject:filterArray[0]] && // [words containsObject:filterArray[1]] && // [words containsObject:filterArray[n]]) // { // [searchResults addObject:text]; // } // // break; default: break; } _filteredResults = [NSArray arrayWithArray:searchResults]; // local global instance of results - use for maintaining order (be sure to clear it between searches) 语句确定该单词集合是否包含每个搜索的单词。

代码示例:

_filteredResults

z数组应该是你想要的。请务必考虑速度和搜索中使用的字符分隔符。

答案 2 :(得分:-2)

您只需使用whereKey:containsString:

即可

如果您想使用其他参数,只需添加一个子查询

即可

答案 3 :(得分:-2)

您的解决方案需要稍微修改一下。

喜欢这样。

PFQuery *query=[PFQuery queryWithClassName:@"post"];
[query whereKey:@"text" containedIn:Array];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
//what your logic you want to write there might comes some records that are counts two times so you can remove those using NSSet
 }];