2015-07-12 12 views
11

Ho un database di parse.com. ho una colonna in una tabella chiamata "testo". Devo trovare il testo con più chiavi che corrispondono alla condizione AND. l'ho provato in tutti i modi. Ho cercato di usare:PFQuery con più vincoli su una chiave

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

o

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

o

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

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

} 

ma nessuno lavora. per favore guidami se parse sdks supporta questo o non totalmente? se sì, come posso ottenere i risultati. molte grazie in anticipo :)

EIDT:

per esempio ho tre voci nel database come testo:

  1. "Ho un'immissione di dati"

  2. " non riesco a trovare qualcosa nei dati "

  3. " come posso fare questo "

se passare "i" e "questo" deve restituire la voce (3)

se passare "i" e "dati" deve restituire la voce (1,2)

se PASS "i" e "altro" deve restituire nulla

+1

La colonna 'text' di tipo stringa? E vorresti determinare se quella stringa contiene una o più parole? L'unico modo per farlo con una query è tramite 'whereKey: matchesRegex:', che è molto costoso. Un'altra idea è limitare il risultato con qualche altro criterio, quindi enumerare il test dei risultati per il contenimento della sottostringa nella logica dell'app. Limita i costi di rete di questa idea facendola nel cloud code. – danh

+0

ho bisogno di determinare se un testo contiene entrambe le parole chiave? Se sì il testo verrà restituito se qualcuno di essi manca nel testo, quel testo sarà rifiutato dalla query. –

risposta

-2

è semplicemente bisogno di utilizzare whereKey:containsString:

e se si desidera utilizzare parametri aggiuntivi, basta semplicemente aggiungere una subquery

+0

prenderà tutti i post corrispondenti a qualsiasi parola chiave di entrambi. non funzionerà –

+0

@ImranAhmed quando ho detto subQuery intendevo la query interna. In ogni caso lo farai, sarà un'alta richiesta dell'API, quindi è una preferenza personale il modo in cui lo fai. – soulshined

+0

subQuery è esattamente "orQueryWithSubQueries" in ssek parse. ma ho bisogno effettivamente "andWithSubQuries" che non è lì in analisi. –

0

A seconda dei requisiti di velocità della query e del numero di oggetti interrogati, proverei a separare i risultati utilizzando componentsSeparatedByString: dopo l'enumerazione attraverso la matrice dei risultati usando qualcosa come: for(NSString *string in results). Dopo aver separato ciascuna stringa in un singolo array, utilizzare una dichiarazione if(...) che determina se la raccolta di parole contiene ogni parola cercata.

esempio di codice:

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) 

L'array _filteredResults dovrebbe essere quello che hai intenzione. Assicurati di considerare la velocità e i separatori di caratteri usati nella ricerca però.

+0

@imran perché abbiamo tentato di risolvere un problema con cui ti stai occupando, e non ti piace il nostro approccio particolare, stai minimizzando chiunque abbia tentato di aiutarti? – ChrisHaze

-2

La soluzione deve essere modificata leggermente.

In questo modo.

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

La ragione per la query non funziona è perché Parse non supporta avere lo stesso vincolo (in questo caso 'containsString:') più di una volta sullo stesso tasto.

Quindi, quello che suggerirei è di interrogare per un'espressione regolare che soddisferà tutte le stringhe di filtro usando - (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]); 
    } 
}]; 
Problemi correlati