10 votes

Interrogation de Core Data avec prédicats - iPhone

Donc, j'essaie de récupérer des objets à partir de données de base. J'ai une liste disons de 80 objets, et je veux pouvoir les rechercher en utilisant une UISearchBar. Ils sont affichés dans un tableau.

En utilisant la documentation d'Apple sur les prédicats, j'ai mis le code suivant dans l'une des méthodes déléguées de UISearchBar.

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
  if (self.searchBar.text !=nil)
  {
    NSPredicate *predicate =[NSPredicate predicateWithFormat:@"name LIKE %@", self.searchBar.text];
    [fetchedResultsController.fetchRequest setPredicate:predicate];
  }
  else
  {
    NSPredicate *predicate =[NSPredicate predicateWithFormat:@"All"];
    [fetchedResultsController.fetchRequest setPredicate:predicate];
  }

  NSError *error = nil;
  if (![[self fetchedResultsController] performFetch:&error]) {
        // Gérer l'erreur
        NSLog(@"Erreur non résolue %@, %@", error, [error userInfo]);
        abort();  // Échec
    }       

  [self.tableView reloadData];

    [searchBar resignFirstResponder];   
    [_shadeView setAlpha:0.0f];
}

Si je saisis dans le champ de recherche une correspondance exacte avec la propriété de nom de l'un de ces objets, la recherche fonctionne, et cela repeuple le tableau avec une seule cellule portant le nom de l'objet. Si je ne recherche pas le nom exact, je n'obtiens aucun résultat.

Des idées?

15voto

gburgoon Points 438

Il semble que l'iPhone n'aime pas l'opérateur LIKE. Je l'ai remplacé par 'contains[cd]' et cela fonctionne comme je le souhaite.

5voto

greenisus Points 1333

Utiliser contains[cd] au lieu de like, et changer:

NSPredicate *predicate =[NSPredicate predicateWithFormat:@"All"];

à:

NSPredicate *predicate =[NSPredicate predicateWithFormat:@"1=1"];

1voto

CMPalmer Points 4760

Avez-vous essayé en utilisant MATCH et les expressions régulières ? Juste par curiosité de voir si LIKE est quelque chose qui devrait être évité sur l'iPhone ou non...

1voto

Nick Points 121

Dans une application typique de Core Data, il faut supprimer le NSFetchedResultsController :

[NSFetchedResultsController deleteCacheWithName: [self.fetchedResultsController cacheName]];

Sinon, vous obtiendrez une exception (idéalement) ou un comportement étrange.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X