我int32
在核心数据数据库中有一个属性。我将其int
用作enum
位字段。
NSPredicate
是否可以根据此 int 的二进制值创建查询项目?像@"bitFieldAttribute & 0x0001"
什么?
我还想知道这是否可以使用二进制类型属性?
我int32
在核心数据数据库中有一个属性。我将其int
用作enum
位字段。
NSPredicate
是否可以根据此 int 的二进制值创建查询项目?像@"bitFieldAttribute & 0x0001"
什么?
我还想知道这是否可以使用二进制类型属性?
NSPredicate
可以处理它,但我不确定 CoreData 是否会接受它作为在数据存储上执行的有效谓词。将按位运算符转换为 SQL 查询可能会遇到问题(如果您使用的是 SQLite 后备存储)。你只需要尝试一下。
但是,语法正是您所期望的:
NSPredicate * p = [NSPredicate predicateWithFormat:@"(3 & 1) > 0"];
NSLog(@"%@", p);
NSLog(@"%d", [p evaluateWithObject:nil]);
日志:
3 & 1 > 0
1
至于在二进制类型的属性上执行此操作(即定义为的属性data
,对吗?)这可能行不通。位运算符仅在对整数进行操作时才真正有意义(据我了解),因此在 an 上执行它NSData
没有多大意义。先将其转换为数字,然后它可能会起作用。
编辑
SQLite 似乎支持这种语法,因为位运算符自 2001 年以来就已经存在,这意味着 Core Data 也可能会接受它。
rockfakie 几乎是对的,但是
NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == %i", valueOneOrThree,valueOneOrThree];
是我需要的。
这是该技术的一个示例/应用。
假设你有一个 NSManagedObject,它有一个整数属性,键路径为“typeValue”。
在代码中的某处定义按位枚举:
typedef enum SomeType {
SomeTypeValueOne = 0x1,
SomeTypeValueTwo = 0x2,
SomeTypeValueThree = 0x4
} SomeType;
现在要查询类型为一或三但不是二的托管对象,请执行以下操作:
SomeType valueOneOrThree = SomeTypeValueOne | SomeTypeValueThree;
NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == typeValue", valueOneOrThree];
// construct NSFetchRequest as normal with predicate...
我几乎不怀疑。
但是您可以将 anenum
用于存储在属性中的值,并使用直接比较而不是位掩码。