PFQuery с несколькими ограничениями на один ключ

У меня есть база данных parse.com. У меня есть столбец в таблице с именем «текст». Я должен найти текст с несколькими ключами, соответствующими условию И. Я пробовал все это. я пытался использовать:

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

но никто не работает. пожалуйста, помогите мне, если parse sdks поддерживает это или не полностью? если да, то как я могу достичь результатов. Спасибо заранее 🙂

Eidt:

например, у меня есть три записи в базе данных в виде текста:

  1. «У меня есть ввод данных»

  2. «Я не могу найти что-то в данных»

  3. "как я могу это сделать"

если передать «i» и «this», он должен вернуть запись (3)

если передать «i» и «данные», он должен возвращать запись (1,2)

если передать «i» и «else», он ничего не должен возвращать

Причина, по которой ваш запрос не работает, заключается в том, что 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]); } }]; 

В зависимости от требований к скорости вашего запроса и количества запрашиваемых объектов, я бы попытался разделить результаты с помощью 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 должен быть тем, что вы хотите. Обязательно рассмотрите скорость и разделители символов, используемые в поиске.

Вам просто нужно использовать whereKey: containsString:

И если вы хотите использовать дополнительные параметры, просто добавьте subQuery

Ваше решение нужно немного изменить.

Как это.

 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 }]; 
  • Анализ: изменение значения указателя
  • Вопрос об отказе на Xcode 6.3
  • Добавление кнопок для каждого объекта в массиве
  • Получение правильного типа при подклассификации PFUser
  • swift - получение поля objectId вызывает фатальную ошибку
  • PFQuery findObjectsInBackgroundWithBlock: приложение WatchKit работает в симуляторе, а не на часах, если приложение iOS не находится на переднем плане
  • Обновление сохраненных данных в Parse iOS
  • Parse saveInBackgroundWithBlock падает на iOS
  • Регистрация для уведомлений Parse iOS7 и iOS8, предупреждения компилятора
  • Ограничения запросов анализа запросов, содержащиеся в списке указателей (где, $ in)
  • Фильтр TableView с использованием Query из другого представления
  • Давайте будем гением компьютера.