2010-09-08 52 views
27

Actualmente estoy teniendo un problema al extraer todos los datos de db, por lo que i.e 1 parámetro es VERDADERO.Datos básicos NSPredicar comprobando el valor BOOL

estoy usando NSPredicate y por debajo es un ejemplo de código

NSManagedObjectContext *context = managedObjectContext_; 

if (!context) { 
    // Handle the error. 
    NSLog(@"ERROR CONTEXT IS NIL"); 
} 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"tblcontent" inManagedObjectContext:managedObjectContext_]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bookmarked == YES"]; 

[request setPredicate:predicate]; 

He intentado establecer predicatewithformat a casi todo, pero todavía no se salga marcadores que tienen un valor YES.

Incluso intenté (@"bookmarked == %d",YES) pero no tuve suerte. No quiero tener que obtener toda la matriz y luego filtrarla manualmente haciendo if(object.bookmarked == YES) ..... blabla.

Realmente agradeceré algo de ayuda.

Muchas gracias.

Respuesta

1

No ha mencionado los resultados que obtendrá. Dos cosas que faltan en su listado de código es dónde establece la entidad de su solicitud y dónde realmente le pide al contexto que ejecute la solicitud de búsqueda. Yo comenzaría allí.

+0

Hola No he incluido eso en el código. Los resultados que obtengo son básicamente todo. Es como si no estuviera funcionando el filtrado. – user281300

+0

Hola de nuevo, creo que hay algo mal antes de eso. Es decir, cada contenido único que vuelve tiene object.bookmarked = YES aunque lo haya configurado en NO de forma predeterminada. Tendré que verificarlo. Creo que el predicado está funcionando. Gracias de todos modos. – user281300

+2

Ja, está funcionando bien ahora. estúpido me olvidé de reiniciar el db del simulador primero doh !! De todos modos, el código anterior está bien. – user281300

53

Basado en el Apple Documento Here, podemos utilizar los dos métodos siguientes para comparar booleano:

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

Sin embargo, el predicado anterior no puede salir con los vacíos anAttribute. Para hacer frente a un atributo vacío, se necesita el siguiente método de acuerdo con el documento de Apple here:

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"]; // it's in the document 

o

predicate = [NSPredicate predicateWithFormat:@"firstName == nil"]; // == and = are interchangeable here 
11

Por alguna razón, la solución de flujo no funcionaría para mí:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"]; 

Sin embargo, esto hizo:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == 1"]; 
+1

También para mi caso, la solución de Flow no funcionó. Funcionó con una Contribución == 1 –

1

Para mí, sucedió porque asignar valor en Object es incorrecto al guardar.

usted tiene que salvar como éste

YourNSMNanagedObject.visibleBoolean = [[NSNumber alloc] initWithBool:false] 

Entonces todo predicado funcionará cuando ir a buscar.

E.g.

// Filter only unvisible item 
NSPredicate *favouriteFilter = [NSPredicate predicateWithFormat:@"visibleBoolean==NO"]; 
10

llego tarde a la fiesta y como se discute el uso de 0 y 1 de es el camino a seguir, sin embargo hay una mejor manera de demostrar esto mediante el uso de literales NSNumber BOOL como @YES o @NO. Lo convierte en 1 o en 0, pero es más fácil de usar.

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == %@", @NO]; 
1

Core entidades de datos no tiene ningún valores por defecto cuando se crea atributos de la entidad, por lo que para hacer su trabajo predicado deberías o valores predeterminados establecidos para los atributos booleanos o el uso de predicados de esta manera.

Si proporcionar un valor predeterminado (NO o SÍ) para cualquier propiedad booleana de la Entidad a continuación, utilizar el predicado como esto

[NSPredicate predicateWithFormat:@"boolAttribute == %@", @NO]; 
[NSPredicate predicateWithFormat:@"boolAttribute == NO", @NO]; 
[NSPredicate predicateWithFormat:@"boolAttribute == %0"]; 

Si no tienen valores por defecto o algunas de las entidades fue ya creado sin valores predeterminados a continuación, a filtrar falsa uso valor de esta frase:

[NSPredicate predicateWithFormat:@"boolAttribute == %@ || boolAttribute == nil", @NO]; 
0

me siguen dando poco a º es uno y no siempre está claro que los booleanos en los datos centrales se guardan como NSNumbers.

En la mayoría de los casos me aseguro de que al crear entidades establezca @NO para cualquier propiedad booleana, pero siempre sucede que dedico mucho tiempo tratando de descubrir por qué una prueba no pasa cuando tengo Olvidé establecer @NO en la creación de la entidad.

Puede que esta no sea la mejor opción para código claro, pero ahora comencé a utilizar siempre predicados! = Para booleanos en datos básicos como (¡Completo! = SÍ) en lugar de (está Completado == NO). El hecho de que nil == patrón falso sea cierto en cualquier otro lugar, pero no en los datos subyacentes, los predicados y las propiedades pueden ser muy confusos.

1

furtivamente en la respuesta Swift 3/4:

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

tenemos que utilizar NSNumber al parecer debido a un bool literal no es aceptable por Apple.

Stolen from here ;)