¿Cómo escribir un predicado BOOL en Core Data?


89

Tengo un atributo de tipo BOOLy quiero realizar una búsqueda de todos los objetos administrados donde se encuentra este atributo YES.

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

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

Pero, ¿cómo hago esto, si tengo un atributo bool llamado selected y quiero hacer un predicado para esto? ¿Podría hacer algo como esto?

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

¿O necesito otros especificadores de formato y simplemente paso YES?

Respuestas:


101

De la guía de programación de predicados :

Usted especifica y prueba la 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 consultar la sintaxis de cadena de formato de predicado .


@inorganik He leído una afirmación similar aquí . No sé cuál es la razón de esto, pero afaik debería funcionar y me funciona.
albertamg

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

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

@inorganik oh ya veo. Si averigua qué causó el fracaso de su caso, me encantaría saberlo. ¡Gracias por el +1! :)
albertamg

93

Swift 4.0

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

¿Hay alguna forma de recuperar todos los objetos para bool es igual a cero? ¿O siempre tiene que ser verdadero o falso?
Apoorv Mote

@ApoorvMote, a partir de Xcode 9.4, Swift 4, sí: si usa un valor Bool regular en el predicado, se encontrarán elementos con nilvalores de atributo. Por ejemplo, establezca el valor de un atributo en nil(diremos que lo llamó boolAttributecomo se muestra en esta respuesta). A continuación, crear su predicado: let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). Nota: boolValuedebe ser igual a trueo false, NO NSNumber(value: boolValue). El predicado resultante será: boolAttribute == nil. Predicado que será devolver los objetos en los que boolAttributees nil. Puede que no funcione para siempre ...
leanne

Esto funciona. También puede utilizar el formato "boolAttribute == 1".
Zoltan Vinkler

35

No convierta a NSNumber, ni use doble "=="

Más apropiado para Swift> = 4:

NSPredicate(format: "boolAttribute = %d", true)

Nota: "verdadero" en este ejemplo es un Bool (una estructura)


2
Debería ser una nueva respuesta aceptada. es 2020 por el amor de Dios
RyanM

16

Swift 3

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

En Swift 3 deberías usar NSNumber(value: true).

El uso de NSNumber(booleanLiteral: true)y, en general, cualquier inicializador literal directamente no se recomienda y, por ejemplo, SwiftLint (v. 0.16.1) generará una advertencia para el ExpressibleBy...Literalinicializador de uso directamente:

Violación de la inicialización del protocolo del compilador: los inicializadores declarados en los protocolos del compilador, por ejemplo ExpressibleByArrayLiteral, no deben llamarse directamente. (compiler_protocol_init)


3
Alternativamente:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Martin R

3

Rápido 4

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

Swift 3

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

2
Esto provoca un bloqueo con Xcode 9.3 y Swift 4.1. Utilice este método en su lugar.
Tamás Sengel

2

Swift 3.0 ha realizado un ligero cambio en esto:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.