2010-08-20 5 views
1

Salut le problème va comme ceci:Comment créer le bon NSPredicate pour ce genre de requête?

J'ai dans les entités de CoreData qui ont un titre et une relation aux entités de mots-clés.

J'ai besoin d'un prédicat qui m'aide à récupérer toutes les entités dont le titre contient les mots-clés que je tape. J'ai le code ci-dessous qui doit le faire, mais il ne fonctionne pas:

NSArray *keywords = [searchString componentsSeparatedByString:@" "]; 
NSString *predicateString = @""; 
for(NSInteger i = 0; i < [keywords count]; i++) { 
    if(((NSString*)[keywords objectAtIndex:i]).length != 0) { 
     if(i==0) { 
      predicateString = [keywords objectAtIndex:i]; 
     } 
     else { 
      predicateString = [predicateString stringByAppendingFormat:@" and keywords.normalizedKeyword contains[cd] %@", [keywords objectAtIndex:i]]; 
     } 

    } 
} 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"keywords.normalizedKeyword contains[cd] %@",predicateString]; 

Par exemple, j'ai des entités avec des titres comme celui-ci:

1) Thème « grand thème de coloriage » 2) » pour enfants » 3) "Voitures pour les enfants"

mes mots-clés db contiendront:

grande colorationthème pour enfants voitures

Comment puis-je créer un prédicat quand je tape par exemple:

Thème

le résultat sera 2) et 3)

ou si je tape:

grand thème

le résultat sera 1) et 2)

Toute aide à obtenir le prédicat droit d'y parvenir est très apprécié. Ce que j'ai essayé de faire là ça ne marche pas et je n'ai plus d'idées.

Merci!

+0

Le moulage n'est * PAS * nécessaire. '-objectAtIndex:' retourne un 'id'. 'id' est tout et n'importe quoi donc la distribution est inutile et une habitude terrible d'entrer en Objective-C. –

+0

Votre boucle 'for' n'est pas non plus nécessaire. Objective-C a une énumération rapide de sorte que vous pouvez le réécrire comme 'pour (NSString * predicateString dans les mots-clés) {' et être fait avec beaucoup de cette logique. –

Répondre

3

J'ai moi-même trouvé la réponse. Pour résoudre un tel problème, vous devez utiliser un NSCompoundPredicate. La solution à mon problème était la suivante:

NSArray *keywords = [lowerBound componentsSeparatedByString:@" "]; 
NSMutableArray *predicates = nil; 
for(NSInteger i = 0; i < [keywords count]; i++) { 
    if(((NSString*)[keywords objectAtIndex:i]).length != 0) { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"keywords.normalizedKeyword contains[cd] %@", [keywords objectAtIndex:i]]; 
     if(predicates == nil) { 
      predicates = [[NSMutableArray alloc] initWithCapacity:0]; 
     } 

     [predicates addObject:predicate]; 
    } 
} 

NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates]; 
Questions connexes