objective nshipster ios core-data nspredicate

ios - nshipster - nspredicate objective c



NSPredicate contiene cadenas en minĂºsculas (3)

Estoy desarrollando una aplicación iOS con iOS SDK 6.0 y XCode 4.5.2. Mi desarrollo objetivo es 4.3.

Estoy usando Core Data para gestionar mis datos. Ahora tengo este NSPredicate para buscar tiendas:

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

Esta es la entidad de la tienda:

Tengo que convertir el nombre a minúsculas y ver si contiene shopSearchBar.text en formato de minúsculas.

Ejemplo:

Tengo estas cuatro tiendas:

  • Tienda1
  • tienda 1
  • mi tienda
  • tienda

Si el texto de búsqueda del usuario es ''comprar'', debe devolverlos todos.

¿Sabes como hacer esto?


(a) Podría agregar una columna a su repositorio (lowercaseName) y cada vez que guarde una Tienda, guarde una versión en minúscula de su nombre. Entonces tu predicado es solo comparar :)

(b) Sin embargo, si todo lo que desea es hacer una comparación que no distinga entre mayúsculas y minúsculas, intente esto:

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

Esto también es comparativo insensible al diacrítico. Mira la sección de comparación de cadenas de esta página de documentos para ver más opciones.

(a) te da consultas más rápidas pero un código más complicado. (b) le proporciona métodos de guardado muy simples pero (un poco) consultas más lentas


Así es como he resuelto mi problema:

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


Debería poder usar el método predicateWithBlock: de NSPredicat:

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