我有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];
}
但没人工作。如果解析sdks支持或不支持,请指导我吗?如果是,我怎样才能达到效果。 非常感谢提前:))
EIDT:
例如我在数据库中有三个条目作为文本:
“我有一个数据条目”
“我在数据中找不到内容”
“我该怎么做”
如果通过“i”和“this”它应该返回条目(3)
如果传递“i”和“data”,则应返回条目(1,2)
如果传递“i”和“else”则不返回任何内容
答案 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)
如果您想使用其他参数,只需添加一个子查询
即可答案 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
}];