我在Core Data数据库中有一个int32
属性。
我将此int
用作enum
位字段。
是否可以创建NSPredicate
来根据二进制文件查询项目
这个int的值?像@"bitFieldAttribute & 0x0001"
?
我也想知道这是否可以使用二进制类型属性?
答案 0 :(得分:26)
NSPredicate
可以处理它,但我不确定CoreData是否会接受它作为在数据存储上执行的有效谓词。它可能无法将按位运算符转换为SQL查询(如果您使用的是SQLite后备存储)。你只需要尝试一下。
然而,语法正是您所期望的:
NSPredicate * p = [NSPredicate predicateWithFormat:@"(3 & 1) > 0"];
NSLog(@"%@", p);
NSLog(@"%d", [p evaluateWithObject:nil]);
日志:
3 & 1 > 0
1
至于在二进制类型属性上执行此操作(即,定义为data
的属性,对吗?)这可能不起作用。按位运算符在整数运算时才真正有意义(只要我理解它们),所以在NSData
上执行它就没有多大意义。首先将它转换为数字,然后它可能会起作用。
修改强>
似乎SQLite支持这种语法,因为bitwise operators have been around since 2001,这意味着Core Data也可能会接受它。
答案 1 :(得分:9)
rockfakie几乎是对的,但是
NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == %i", valueOneOrThree,valueOneOrThree];
是我需要的。
答案 2 :(得分:8)
这是该技术的一个示例/应用。
假设您有一个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...
答案 3 :(得分:-1)
我几乎不怀疑。
但是您可以使用enum
作为属性中存储的值,并使用直接比较而不是位掩码。