[英]Combining conditional queries isn't working properly?
我需要使用parse.com方法orQueryWithSubquerries:
创建组合的条件查询。
这是我的代码:
PFQuery *testQuery = [PFUser query];
[testQuery whereKey:@"displayName notEqualTo:@"Bob"];
PFQuery *testQuery2 = [PFUser query];
[testQuery whereKey:@"username" notEqualTo:@"frank"];
PFQuery *orQuery = [PFQuery orQueryWithSubqueries:@[testQuery, testQuery2]];
[orQuery findObjectsInBackgroundWithBlock:^(NSArray *users, NSError *error) {
if (!error) {
PFUser *user = [users firstObject];
}
}];
该代码运行良好,但是它返回了我的所有用户对象,包括应该从2个查询中过滤掉的对象。 我使用此方法是否错误,或者我需要使用某种方法吗?
编辑:
我也曾尝试完全按照此parse.com示例的方式使用此方法,但仍然无法正常工作。
PFQuery *testQuery = [PFUser query];
[testQuery whereKey:@"numberOfPhotos" greaterThan:@(3)];
PFQuery *testQuery2 = [PFUser query];
[testQuery whereKey:@"numberOfPhotos" lessThan:@(1)];
PFQuery *orQuery = [PFQuery orQueryWithSubqueries:@[testQuery, testQuery2]];
[orQuery findObjectsInBackgroundWithBlock:^(NSArray *users, NSError *error) {
if (!error) {
// users still contains every user in the app even though it shouldn't according to the parse example
}
}];
您无需执行复合查询,只需定期查询:
PFQuery *userQuery = [PFUser query];
[userQuery whereKey:@"displayName" notEqualTo:@"Bob"];
[userQuery whereKey:@"username" notEqualTo:@"frank"];
[userQuery findObjectsInBackgroundWithBlock:^(NSArray *users, NSError *error) {
if (!error) {
PFUser *user = [users firstObject];
}
}];
您目前无法使用复合查询,
TestQuery =所有用户的显示不是bob。 (包括用户名坦率的用户)
TestQuery2 =用户名不坦率的所有用户。 (包括显示名称为Bob的用户)
当您将它们组合在一起时,您会得到所有用户,您的化合物是矛盾的。
基本上,query1中遗漏的所有用户都包含在query2中。 并且,query2中遗漏的所有用户都包含在query1中。 当您组合这些查询时,它们会填补缺少的空间,您会得到所有用户。
如果您尝试执行hasPrefix,似乎应该可以正常工作:
NSString * prefixToSearch = ...;
PFQuery * displayNameQuery = [PFUser query];
[displayNameQuery whereKey:@"displayName" hasPrefix:prefixToSearch];
PFQuery * usernameQuery = [PFUser query];
[usernameQuery whereKey:@"username" hasPrefix:prefixToSearch];
PFQuery * compoundQuery = [PFQuery orQueryWithSubqueries:@[displayNameQuery, usernameQuery]];
[orQuery findObjectsInBackgroundWithBlock:^(NSArray *users, NSError *error) {
if (!error) {
NSLog(@"Found %i users", users.count);
}
}];
PFQuery *testQuery = [PFUser query];
[testQuery whereKey:@"numberOfPhotos" greaterThan:@(3)];
PFQuery *testQuery2 = [PFUser query];
[testQuery whereKey:@"numberOfPhotos" lessThan:@(1)];
PFQuery *orQuery = [PFQuery orQueryWithSubqueries:@[testQuery, testQuery2]];
[orQuery findObjectsInBackgroundWithBlock:^(NSArray *users, NSError *error) {
if (!error) {
// users still contains every user in the app even though it shouldn't according to the parse example
for (PFUser * user in users) {
int numberOfPhotos = [user[@"numberOfPhotos"] intValue];
if (1 <= numberOfPhotos && numberOfPhotos <= 3) {
NSLog(@"Query is failing");
}
}
}
}];
通过我们的对话,我们可以使用它:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"keyOne BEGINSWITH 'z' OR keyTwo BEGINSWITH 'a'"];
PFQuery * userQuery = [PFQuery queryWithClassName:@"_User" predicate:predicate];
[userQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
NSLog(@"Found objects: %@", objects);
}];
再次研究之后,我最终将解决方案更改为基于正则表达式而不是谓词。 就我而言,这意味着我不需要创建其他小写显示名称属性,因为Parse regex允许使用不区分大小写的选项。 同样,我可以更轻松地以更高的灵活性来更改搜索参数。
我的代码现在看起来像这样:
// Uses regex to remove white space at the beginning and end of search text
NSString *modifiedSearchText = [Utility stringTrimmedForLeadingAndTrailingWhiteSpacesFromString:self.searchText];
PFQuery *userUsernameQuery = [PFUser query];
// the @"i" modifier is stated in the parse documentation and means case-insensitive
[userUsernameQuery whereKey:@"username" matchesRegex:modifiedSearchText modifiers:@"i"];
PFQuery *userDisplaynameQuery = [PFUser query];
[userDisplaynameQuery whereKey:@"displayName" matchesRegex:modifiedSearchText modifiers:@"i"];
PFQuery *userQuery = [PFQuery orQueryWithSubqueries:@[userUsernameQuery, userDisplaynameQuery]];
[userQuery orderByAscending:@"username"];
return userQuery;
在iOS 8.3中,xcode 6.3.1
query.whereKey("name", matchesRegex:searchBar.text, modifiers:"i")
搜索大写或小写单词
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.