2011-05-29 10 views
56

Tengo un atributo del tipo BOOL y deseo realizar una búsqueda para todos los objetos administrados donde este atributo es YES.Cómo escribir un predicado BOOL en Core Data?

Para los atributos de cadena es sencillo. Creo un predicado como esto:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName]; 

Pero ¿cómo hacer esto, si tengo un atributo booleano llamada seleccionada y quiero hacer un predicado para esto? ¿Podría hacer algo como esto?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber]; 

o tengo otros especificadores de formato y sólo tiene que pasar YES?

Respuesta

91

De Predicate Programming Guide:

Se especifica y prueba de igualdad de valores booleanos como se ilustra en los siguientes ejemplos:

NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]]; 
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"]; 

También puede revisar la Predicate Format String Syntax.

+0

@inorganik He leído un reclamo similar [aquí] (http://stackoverflow.com/a/22043435/375300). No sé cuál es la razón de esto, pero afaik * debería * funcionar y lo hace por mí. – albertamg

+0

@inorganik También lo probé y funcionó ("lo hace por mí"). No sé lo que has intentado. Tengo curiosidad por eso. Si lo desea, comparta un enlace a un caso de prueba para que pueda probar el mismo código. – albertamg

+0

Volví a probar y funcionó ... así que estaba equivocado. Algo más debe haber causado que mi caso falle. De cualquier manera, +1 en tu respuesta – inorganik

37

Swift 4,0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true)) 
+0

¿Hay alguna manera de obtener todos los objetos para bool es igual a cero? ¿O siempre tiene que ser verdadero o falso? –

2

Swift 3,0 ha hecho un ligero cambio a esto:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true)) 
12

Swift 3

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true)) 

En Swift 3 debe usar NSNumber(value: true).

Usando NSNumber(booleanLiteral: true) y en general cualquier initialiser literal directamente se desanima y, por ejemplo SwiftLint (v 0.16.1.) Generará advertencia para el uso ExpressibleBy...Literal initialiser directamente:

Compilador Protocolo Init Violación: Los inicializadores declaran en Los protocolos de compilación como ExpressibleByArrayLiteral no se deben invocar directamente. (Compiler_protocol_init)

+2

Alternativamente: 'NSPredicate (formato:" boolAttribute ==% @ ", verdadero como NSNumber)' –

2

Swift 4

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)