web-dev-qa-db-fra.com

NSPredicate contient une chaîne en minuscules

Je développe une application iOS avec iOS SDK 6.0 et XCode 4.5.2. Mon objectif de développement est 4.3.

J'utilise Core Data pour gérer mes données. J'ai maintenant ce NSPredicate pour rechercher des magasins:

if ((shopSearchBar.text != nil) && ([shopSearchBar.text length] > 0))
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",shopSearchBar.text];
    [fetchRequest setPredicate:predicate];
}

Il s'agit de l'entité boutique:

enter image description here

Je dois convertir nom en minuscules et voir s'il contient shopSearchBar.text au format minuscule.

Exemple:

J'ai ces quatre magasins:

  • Boutique1
  • boutique 1
  • mon magasin
  • Boutique

Si le texte de recherche de l'utilisateur est "boutique", il doit tous les renvoyer.

Savez-vous comment faire cela?

19
VansFannel

Voici comment j'ai résolu mon problème:

if ((shopSearchBar.text != nil) && ([shopSearchBar.text length] > 0))
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",
                              shopSearchBar.text];
    [fetchRequest setPredicate:predicate];
}
61
VansFannel

Vous devriez pouvoir utiliser la méthode predicateWithBlock: de NSPredicat:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bind) {
return [self.name compare:shopSearchBar.text options:NSCaseInsensitiveSearch] == NSOrderedSame; }];
3
mjvotaw

(a) Vous pouvez ajouter une colonne à votre référentiel - lowercaseName - et chaque fois que vous enregistrez une boutique, enregistrez une version uniquement en minuscules de son nom. Alors votre prédicat est juste de comparer :)

(b) Cependant, si tout ce que vous voulez est de faire une comparaison insensible à la casse, essayez ceci:

if ((shopSearchBar.text != nil) && ([shopSearchBar.text length] > 0))
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] %@",shopSearchBar.text];
    [fetchRequest setPredicate:predicate];
}

Cette comparaison est également insensible aux signes diacritiques. Regardez la section Comparaison de chaînes de cette page de documentation pour plus d'options.

(a) vous donne des requêtes plus rapides mais du code plus compliqué. (b) vous donne des méthodes de sauvegarde très simples mais des requêtes (légèrement) plus lentes

2
deanWombourne