iphone - NSPredicate: filtrado de valores basados en un valor almacenado de BOOLEAN
xcode (7)
De la documentación de Apple:
Valores booleanos
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"];
Sin embargo, algo que me llamó la atención:
Asegúrese de desmarcar el atributo de entidad Optional
y establecer un Default Value
de YES
o NO
, de lo contrario, la columna estará vacía (¿nula?) Y los predicados anteriores no coincidirán con las filas que no están establecidas explícitamente.
Usé la gran aplicación sqllitebrowser para diagnosticar esta, mirando la base de datos del simulador resultante.
Tengo un objeto de modelo de datos de núcleo llamado Entrada. En esto tengo un atributo IsFavorite.
Me gustaría usar un NSPredicate para filtrar los resultados de mi NSFetchedResultsController.
Actualmente estoy recibiendo EXC_BAD_ACCESS cuando se ejecuta la recuperación.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *thisEntry = [NSEntityDescription entityForName:@"Entry" inManagedObjectContext:managedObjectContext_];
[fetchRequest setEntity:thisEntry];
NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"Entry.isFavorite == %@", [NSNumber numberWithBool: YES]];
[fetchRequest setPredicate:predicate];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
NSError *error = nil;
if (![aFetchedResultsController performFetch:&error]) {
NSlog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
Si elimino la línea que establece el predicado en el fetchRequest, mi código se ejecuta perfectamente.
Claramente, no tengo nada que ver con el predicado, pero he tenido muchos problemas para intentar averiguar cómo realizar operaciones en un valor BOOLEAN desde un objeto de modelo de datos de núcleo. Se observa que hay respuestas sobre cómo hacer esto con una cadena o valor int, pero no puedo encontrar un ejemplo de BOOLEAN.
Muchas gracias !
Esto no es realmente específico para NSPredicate ... Siempre que tenga %@
en una cadena de formato, el valor correspondiente debe ser un puntero a un objeto, y BOOL no califica. Entonces, en lugar de pasar SÍ, pase [NSNumber numberWithBool: YES]
.
En las versiones más recientes de Xcode y SDK que cuando escribí la respuesta originalmente, puede usar @YES
lugar de [NSNumber numberWithBool: YES]
.
La versión swift 3 funcionó muy bien para mí:
let predicate = NSPredicate(format: "isFriend == %@" ,NSNumber(booleanLiteral: false))
Después de responder a @scipilot, el bool no debería ser opcional. ¡gracias por eso!
Para mí, en SWIFT 3.0 use NSNumber y% @ no funcionó, tuve que usar valores enteros:
NSPredicate(format: "yourAttributeName == %i", yourBooleanValue ? 1 : 0)
Para mi funciono asi
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(isComplete LIKE[c] %@)",[NSString stringWithFormat:@"%@",[NSNumber numberWithBool:YES]]];
Si sabe que está buscando un SÍ (y por lo tanto no necesita cambiar entre SÍ o NO en diferentes situaciones), esto funcionó para mí:
[NSPredicate predicateWithFormat:@"isFavorite == 1"]
en iOS 10, xcode 9.0, en busca de un núcleo de datos gestionadosObject con el atributo booleano NO:
[NSPredicate predicateWithFormat:@"attributeName == nil"]