2011-09-12 16 views
5

Sto cercando di capire come concatenare i nomi degli attributi. Ho un attributo county e district che voglio interrogare comeAttributi concatenanti NSPredicate

[NSPredicate predicateWithFormat:@"county + district contains[cd] %@",searchBar.text] 

mi dà generazione SQL non implementata per errore di predicato. e non sono sicuro di come implementare NSPredicate. Grazie

risposta

7

Questo dovrebbe darvi un'idea di come fare una ricerca più complicata. Essa corrisponderà query per "distretto della contea", "distretto della contea", ecc

NSArray *searchTerms = [searchBar.text componentsSeparatedByString:@" "]; 
    NSString *predicateFormat = @"(county contains[cd] %@) OR (district contains[cd] %@)"; 
    NSPredicate *predicate; 
    if ([searchTerms count] == 1) { 
     NSString *term = [searchTerms objectAtIndex:0]; 
     predicate = [NSPredicate predicateWithFormat:predicateFormat, term, term]; 
    } else { 
     NSMutableArray *subPredicates = [NSMutableArray array]; 
     for (NSString *term in searchTerms) { 
      NSPredicate *p = [NSPredicate predicateWithFormat:predicateFormat, term, term]; 
      [subPredicates addObject:p]; 
     } 
     predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates]; 
    } 
    [fetchRequest setPredicate:predicate]; 

Vedi Cocoa Is My Girlfriend: Adding iTunes-style search to your Core Data application maggiori spiegazioni.

+1

Questo non è equivalente. concatenare "ABC" + "DEF" corrisponderebbe a "CDE". La tua soluzione non lo farebbe. Capisco che nel contesto OP non è probabile che si tratti di un problema. Sarebbe nel mio Quindi la domanda è la seguente: come si concatenano 2 colonne di un'entità prima della corrispondenza? –

+1

@ Jean-DenisMuys hai mai trovato la risposta? http://xkcd.com/979/ – figha

+0

Ho finito per aggiungere un attributo derivato che ho calcolato per essere la concatenazione di due sorgenti. Quindi ho un predicato su quell'attributo derivato. Questo spreca spazio nel mio database CoreData, ma è un prezzo che posso pagare nel mio caso. Potrei averlo reso un attributo transitorio, ma non sono sicuro che tu possa eseguire una query su uno. (TBH, non ho nemmeno provato) –

0
[NSPredicate predicateWithFormat:@"county contains[cd] %@ AND district contains[cd] %@",searchBar.text,searchBar.text]; 

Basta provare le righe precedenti di codice, sarebbe ti aiuta.

+0

che sarebbe un operatore 'o', se ho ben capito l'intento OP correttamente –

+0

@ Jean-DenisMuys in questione ha precisato i thats Provincia Stato + perché ho usato E qui – Raj

+1

fine. Ciò non risponde tuttavia alla domanda originale dell'OP, che era "come concatenare l'attributo [con] nomi [nei predicati]?", Anche se l'OP non significava * esattamente quello. –

3

Ho finito per implementare un altro campo come concatenare le due variabili (distretto + paese) ed eseguire la query su quella variabile.

+0

Potrebbe essere utile con uno snippet di codice da cui le persone possono imparare? – Monolo

1

ho fatto qualcosa di simile e ha concluso che, come cekisakurek, il metodo migliore è stato quello di concatenare i campi in un campo comune (più rilevanti per nome/cognome)

- (NSString *)fullName { 
    return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName]; 
} 

e poi filtrati in questo campo usando ' contiene [cd]'

[NSPredicate predicateWithFormat:@"fullName contains[cd] %@", self.searchBar.text];