2015-07-12 29 views
11

我有parse.com數據庫。我有一個名爲「文本」的表中的列。 我必須找到與AND條件匹配的多個鍵的文本。 我試了一下。我試圖用:對一個密鑰有多個約束的PFQuery

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. 」我該怎麼做「

如果通過 「i」 和 「這個」,它應該返回條目(3)

如果通過 「i」 和 「數據」,它應該返回條目(1,2)

如果通過「我」和「其他」,它應該返回什麼

+1

列'text'是字符串類型嗎?你想確定該字符串是否包含一個或多個單詞?通過'whereKey:matchesRegex:'進行查詢的唯一方法是,這非常昂貴。另一個想法是用其他標準限制結果,然後枚舉應用程序邏輯中的子字符串包含的結果測試。通過在雲代碼中完成此限制網絡成本。 – danh

+0

我需要確定一個文本是否包含兩個關鍵字?如果是,文本將被返回,如果它們中的任何一個在文本中丟失,則該文本將被查詢拒絕。 –

回答

-2

你只是簡單地需要使用whereKey:containsString:

如果要使用額外的參數,你只需簡單地增加一個子查詢

+0

它會將所有帖子都與任何兩個關鍵字匹配。它不會工作 –

+0

@ImranAhmed當我說subQuery我的意思是內部查詢。無論哪種方式,你會這樣做,這將是一個很高的API請求,所以它是個人喜好,你如何去做這件事。 – soulshined

+0

子查詢在解析sdk中完全是「orQueryWithSubQueries」。但我實際上需要「andWithSubQuries」,這在解析中是不存在的。 –

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陣列應該是你在想什麼。請務必考慮速度和搜索中使用的字符分隔符。

+0

@imran因爲我們試圖解決你正在處理的一個問題,而且你不喜歡我們特別的方法,所以你試圖幫助你的每個人都會失敗? – ChrisHaze

-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 
}]; 
2

查詢不工作的原因是解析不支持具有相同的約束(在這種情況下,「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]); 
    } 
}];