2013-04-11 2 views
1

J'ai un modèle:iOS Simple prédicats 'contient' ne fonctionne pas

lieu < --- >> catégorie

Lorsque vous effectuez la requête suivante:

NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Category"]; 
if(![searchText isEqualToString:@""] && searchText != nil){ 
    req.predicate = [NSPredicate predicateWithFormat:@"(places.placeTitle contains %@) OR (places.details contains %@) OR (name contains %@)", searchText, searchText, searchText]; 
    NSLog(@"ModelHelper.getResults: Search text given, creating predicate: %@", req.predicate); 
} 
req.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" 
                      ascending:YES 
                       selector:@selector(localizedCaseInsensitiveCompare:)]]; 
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]initWithFetchRequest:req 
                      managedObjectContext:context 
                       sectionNameKeyPath:nil 
                         cacheName:nil]; 
NSError *error = nil; 
[controller performFetch:&error]; 

Je reçois matchs qui devrait pas être là, par exemple:

searchText = "1234" 

les premiers résultats sont:

category[0].name = "Bars" 
category[0].places[0].placeTitle = "Aaa" 
category[0].places[0].details = "Aaa" 
category[0].places[1].placeTitle = "123456" 
category[0].places[1].details = "123456" 
category[0].places[2].placeTitle = "test" 
category[0].places[2].details = "test" 

Y at-il quelque chose que je fais mal avec mon prédicat? Merci.

+0

req.predicate = [NSPredicate predicateWithFormat: @ "(places.placeTitle CONTIENT% @) OR (places .details CONTAINS% @) OR (nom CONTAINS% @) ", searchText, searchText, searchText]; –

Répondre

1

De l'documentation:

Important: Vous ne devez pas modifier fetchRequest après avoir invoqué cette méthode. Par exemple, vous ne devez pas modifier son prédicat ou les ordres de tri.

Déplacer ce segment:

if(![searchText isEqualToString:@""] && searchText != nil){ 
    req.predicate = [NSPredicate predicateWithFormat:@"(places.placeTitle contains[c] %@) OR (places.details contains[c] %@) OR (name contains[c] %@)", searchText, searchText, searchText]; 
    NSLog(@"ModelHelper.getResults: Search text given, creating predicate: %@", req.predicate); 
} 

Avant d'initialiser le FRC

+0

Merci. J'ai essayé de changer comme vous l'avez suggéré (comme indiqué dans le code mis à jour ci-dessus) mais je reçois toujours le même comportement. – wuntee

+0

Mais vos résultats correspondent au prédicat: places [2] .placeTitle = "1234 ..." –

+0

Oui, les résultats contiennent des éléments qui ne correspondent pas. places [1] n'a pas de titre ou de détails correspondant à "1234". – wuntee