2015-07-12 18 views
11

Mam bazę danych parse.com. Mam kolumnę w tabeli o nazwie "tekst". Muszę znaleźć tekst z wieloma kluczami pasującymi do warunku AND. Próbowałem na wszystkie sposoby. Próbowałem użyć:PFQuery z wieloma ograniczeniami na jednym kluczu

PFQuery *query=[PFQuery queryWithClassName:@"post"]; 
    [query whereKey:@"text" containedIn:Array]; 

lub

PFQuery *query=[PFQuery queryWithClassName:@"post"]; 
    [query whereKey:@"text" containsAllObjectsInArray:Array];   

lub

PFQuery *query=[PFQuery queryWithClassName:@"post"]; 
for (NSString *str in filtersArray) { 

    [query whereKey:@"text" containsString:str]; 

} 

ale nikt nie pracuje. proszę mnie poprowadzić, jeśli parse sdks obsługuje to czy nie całkowicie? jeśli tak, jak mogę osiągnąć wyniki. wiele z góry dzięki :)

EIDT:

na przykład mam trzy wpisy w bazie danych jako tekst:

  1. "Mam wprowadzanie danych"

  2. " nie mogę znaleźć czegoś w danych "

  3. " jak mogę to zrobić "

jeżeli przejdzie "i" oraz "w tym" należy zwrócić wejścia (3)

jeżeli przejdzie "i" oraz "danych" należy zwrócić wejście (1,2)

czy przejść „ja” i „inny”, to powinien wrócić nic

+1

Czy kolumna "tekst" jest łańcuchem typu? I chcesz sprawdzić, czy ten ciąg zawiera jedno lub więcej słów? Jedynym sposobem na zrobienie tego przy pomocy zapytania jest 'whereKey: matchesRegex:', co jest bardzo kosztowne. Innym pomysłem jest ograniczenie wyniku za pomocą jakiegoś innego kryterium, a następnie wyliczenie wyników testowania dla izolacji substring w logice aplikacji. Ogranicz koszty sieciowe tego pomysłu, wykonując go w kodzie chmurowym. – danh

+0

muszę określić, czy tekst zawiera oba słowa kluczowe? Jeśli tak tekst zostanie zwrócony, jeśli któryś z nich nie ma w tekście, tekst zostanie odrzucony przez zapytanie. –

Odpowiedz

-2

Po prostu wystarczy użyć whereKey:containsString:

a jeśli chcesz użyć dodatkowych parametrów, wystarczy po prostu dodać podkwerendzie

+0

zajmie wszystkie posty pasujące do dowolnych słów kluczowych obu. to nie zadziała –

+0

@ImranAhmed kiedy powiedziałem, subQuery miałem na myśli wewnętrzne zapytanie. Tak czy inaczej to zrobisz, będzie to prośba o wysokie API, więc to osobiste preferencje, jak sobie z tym poradzić. – soulshined

+0

subQuery jest dokładnie "orQueryWithSubQueries" w parse sdk. ale muszę faktycznie "andWithSubQuries", którego nie ma w analizie. –

0

W zależności od wymagań dotyczących prędkości zapytania i liczby obiektów, których dotyczy zapytanie, spróbuję oddzielić wyniki przy użyciu componentsSeparatedByString: po wyliczeniu za pomocą tablicy wyników przy użyciu czegoś takiego jak: for(NSString *string in results). Po rozdzieleniu każdego ciągu znaków na pojedynczą tablicę użyj instrukcji if(...), która określa, czy zbiór słów zawiera każde wyszukane słowo.

przykładem Kod:

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) 

Tablica _filteredResults powinno być to, czego chce. Pamiętaj, aby wziąć pod uwagę prędkość i separatory znaków stosowane w wyszukiwaniu.

+0

@imran, ponieważ próbowaliśmy rozwiązać problem, z którym masz do czynienia i nie podoba ci się nasze szczególne podejście, popierasz wszystkich, którzy próbowali ci pomóc? – ChrisHaze

-2

Twoje rozwiązanie wymaga nieco modyfikacji.

Podoba mi się to.

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

Powodem zapytanie nie działa tak, ponieważ nie obsługuje składni o tym samym ograniczenie (w tym przypadku „containsString:”) więcej niż jeden raz na tym samym klawiszu.

Proponuję więc zapytanie o wyrażenie regularne, które będzie pasowało do wszystkich ciągów filtrów przy użyciu - (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]); 
    } 
}]; 
Powiązane problemy