2010-06-10 10 views
1

bonjour là et désolé pour la question stupide mais je pense que je pourrais manquer quelque chose de simple ici et ne peux pas le comprendre moi-même.NSString * predicateFormat comment rechercher deux entités

im essayant de rechercher une vue de tableau en utilisant le code suivant:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ 

    NSString *predicateFormat = @"(name contains[c] %@) OR (age contains[c] %@)"; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString]; 
    self.fetchedResultsController = [self resetFetchedResultsController:predicate cached:NO]; 

    NSError *error = nil; 
    [self.fetchedResultsController performFetch:&error]; 

    // Return YES to cause the search result table view to be reloaded. 
    return YES; 
} 

ce que je veux réaliser est lorsque l'utilisateur effectue une recherche de la table pour être en mesure de rechercher non seulement par « nom » mais avec « l'âge " ainsi que!

mon code ci-dessus ne recherche que le "nom"

Suis-je manque quelque chose de simple?

merci pour votre temps

+0

Est-ce que 'age' est une chaîne ?! – kennytm

+0

oui c'est une chaîne! – treasure

Répondre

3

Au lieu de:

NSString *predicateFormat = @"(name contains[c] %@) OR (age contains[c] %@)"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString]; 

Vous avez trois options:

NSString *predicateFormat = @"(name contains[c] %@) OR (age contains[c] %@)"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString, searchString]; 

Ou:

NSString *predicateFormat = @"(name contains[c] %[email protected]) OR (age contains[c] %[email protected])"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString]; 

Ou:

NSString *predicateFormat = @"(name contains[c] $SEARCH) OR (age contains[c] $SEARCH)"; 
NSPredicate *template = [NSPredicate predicateWithFormat:predicateFormat]; 
NSPredicate *predicate = [template predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:searchString forKey:@"SEARCH"]]; 

La 3ème option est intéressante si vous construisez un grand prédicat ayant un nombre inconnu de substitutions. Le 2nd est probablement le plus simple en termes de ne pas se répéter, mais le 1er est le plus facile à comprendre.

+0

merci! c'est super! J'apprécie votre temps pour répondre à ma question! – treasure

+1

trésor: Pour clarifier: Le code original utilise deux spécificateurs de format, mais ne fournit qu'un seul objet. Cela non seulement ne fonctionne pas, mais peut tomber en panne. La première solution fournit autant d'arguments que les spécificateurs de format; la deuxième solution fournit un argument et fait référence au premier argument des deux spécificateurs de format; le troisième utilise un dictionnaire au lieu d'une liste d'arguments et se réfère à l'argument par nom (clé du dictionnaire). –

+0

merci! Lorsque vous êtes assez nouveau à ce sujet et que vous n'avez jamais eu une formation adéquate, il est difficile de coder et de comprendre ce qui se passe derrière chaque ligne de code. Je me sens comme un aveugle qui se fraye un chemin ... Mais avec l'aide des développeurs, des ingénieurs Apple, etc., j'ai commencé à "voir" de la lumière au bout du tunnel. J'ai eu très longtemps devant moi mais je n'abandonne pas et n'arrête pas de lire et de poser des questions. Je vous remercie! – treasure