2012-09-21 17 views
31

Mirado alta y baja de éste, pero no puede encontrar mi respuesta. Estoy buscando consultar datos centrales para todos los registros que NO son iguales a una cadena especificada. Por ejemplo, todos los registros que no son iguales a la ID de la sesión actual. He intentado esto en vano:consulta NSPredicate por no contener una cadena específica

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"listingID != %@", [sitListingID objectAtIndex:i]]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ NOT CONTAINS[cd] %@",@"listingID", [sitListingID objectAtIndex:i]]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ NOT CONTAINS %@",@"listingID", [sitListingID objectAtIndex:i]]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"listingID NOT like %@", [sitListingID objectAtIndex:i]]; 

Nothing works.HEEEEELP !!! ------------------------------------------------- ---- más código

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ListingRecord" inManagedObjectContext:context]; 
    [request setEntity:entity]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"sessionID <> %@", uniqueSessionListings]; 
    [request setPredicate:predicate]; 
    NSError *error = nil; 
    NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy]; 
+0

podría proporcionar un método conjunto? Puede ser que busque datos emtpy. – NeverBe

Respuesta

96

Su primera predicado

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"listingID != %@", sessionID]; 

deben trabajar para encontrar todos los registros en los que el atributo listingID no es igual a sessionID (siempre que listingID y sessionID tienen el mismo tipo).

Si ambos son cadenas y que desea encontrar todos los registros donde listingIDDe no contiene la cadena sessionID como una subcadena, entonces este predicado debería funcionar:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (listingID CONTAINS %@)", sessionID]; 

uso "contiene [cd]" si la comparación de cadenas debe hacerse en case y diacritical insensitive.

NOTA: Se puede especificar el nombre del atributo como un argumento, pero entonces se debe utilizar en lugar de %K%@ como formato:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (%K CONTAINS %@)", @"listingID", sessionID]; 
+1

HECK YEAH! Eso hizo el truco. Pregunta lateral rápida, a menos que me vaya a quedar ciego, no leí tu solución en la Guía de programación de Apple Predicate. ¿Lo extrañé en la guía o está cubierto en otro lugar? (Pidiendo para futuras referencias) – sangony

+3

@sangony: Cuando empecé con la programación de Datos Básicos también tenía dificultades con los predicados, la Guía de programación de predicados podría ser más detallada. A veces es complicado combinar todas las posibles comparaciones, operaciones y predicados en el orden correcto. Se podría decir que todo está dicho en la "Definición de BNF de los predicados de cacao" :-) - Aprendí mucho leyendo las preguntas y respuestas de otras personas aquí en SO. –

+1

Esto es útil, pero hay una manera de añadir un operador "no contiene" a un 'NSPredicateEditorRowTemplate'? Hay un 'NSContainsPredicateOperatorType' pero no un' NSDoesNotContainPredicateOperatorType' (a menos que me lo haya perdido). – Jon

Cuestiones relacionadas