簡體   English   中英

組合條件查詢無法正常工作?

[英]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);
    }
}];

更新2-讓我們測試

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");
            }
        }

    }
}];

更新3-謂詞!

通過我們的對話,我們可以使用它:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM