iphone core-data nspredicate bit-fields nsfetchrequest

iphone - ¿Cómo usar banderas binarias en Core Data?



core-data nspredicate (4)

Tengo un atributo int32 en una base de datos Core Data. Yo uso este int como un campo de bit de enum .

¿Es posible crear un NSPredicate para consultar elementos en función del valor binario de este int? Algo como @"bitFieldAttribute & 0x0001" ?

También me pregunto si esto es posible con un atributo de tipo binario.


Aquí hay un ejemplo / aplicación de esta técnica.

Supongamos que tiene un NSManagedObject que tiene un atributo entero con la ruta de clave "typeValue".

En algún lugar de tu código, define una enumeración bit a bit:

typedef enum SomeType { SomeTypeValueOne = 0x1, SomeTypeValueTwo = 0x2, SomeTypeValueThree = 0x4 } SomeType;

Ahora, para consultar los objetos administrados que son de tipo decir Uno o Tres, pero no Dos, haga lo siguiente:

SomeType valueOneOrThree = SomeTypeValueOne | SomeTypeValueThree; NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == typeValue", valueOneOrThree]; // construct NSFetchRequest as normal with predicate...


No lo dudo.

Pero puede usar una enum para los valores almacenados en el atributo y usar una comparación directa en lugar de un enmascaramiento de bits.


Rockfakie es casi correcto, pero

NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == %i", valueOneOrThree,valueOneOrThree];

Es lo que necesitaba


NSPredicate puede manejarlo, pero no estoy seguro de si CoreData lo aceptará como un predicado válido para la ejecución en un almacén de datos. Puede tener problemas para convertir el operador bit a bit en una consulta SQL (si está utilizando una tienda de respaldo SQLite). Tendrás que probarlo.

La sintaxis, sin embargo, es justo lo que esperarías:

NSPredicate * p = [NSPredicate predicateWithFormat:@"(3 & 1) > 0"]; NSLog(@"%@", p); NSLog(@"%d", [p evaluateWithObject:nil]);

Registros:

3 & 1 > 0 1

En cuanto a hacer esto en un atributo de tipo binario (es decir, uno definido como data , ¿verdad?) Probablemente esto no funcionará. Los operadores NSData solo tienen sentido cuando se trabaja con enteros (en la medida en que los entiendo), por lo que ejecutarlo en un NSData no tendría mucho sentido. Primero conviértalo en un número, y luego podría funcionar.

editar

Parece que SQLite admite esta sintaxis, ya que los operadores bit a bit han estado presentes desde 2001 , lo que significa que Core Data probablemente lo acepte también.