我在Core Data数据库中有一个int32
属性。
我将这个int
用作enum
的位字段。
是否可以创建一个NSPredicate
,根据此int的二进制值查询项目?例如@"bitFieldAttribute & 0x0001"
?
我还想知道是否可以使用二进制类型的属性实现这一点?
我在Core Data数据库中有一个int32
属性。
我将这个int
用作enum
的位字段。
是否可以创建一个NSPredicate
,根据此int的二进制值查询项目?例如@"bitFieldAttribute & 0x0001"
?
我还想知道是否可以使用二进制类型的属性实现这一点?
NSPredicate
可以处理这个问题,但我不确定CoreData是否会接受它作为有效的谓词用于数据存储的执行。如果您使用SQLite后备存储,则可能会遇到将按位运算符转换为SQL查询的问题。您需要尝试一下。
然而,语法就像你预期的那样:
NSPredicate * p = [NSPredicate predicateWithFormat:@"(3 & 1) > 0"];
NSLog(@"%@", p);
NSLog(@"%d", [p evaluateWithObject:nil]);
日志:
3 & 1 > 0
1
对于在二进制类型的属性上执行此操作(即定义为data
的属性),这可能行不通。位运算符只有在操作整数时才真正有意义(就我所知),因此在NSData
上执行它并没有多大意义。首先将其转换为数字,然后再尝试执行。
编辑
看起来SQLite支持此语法,因为位运算符自2001年以来就存在,这意味着Core Data也可能接受它。
rockfakie几乎是正确的,但是
NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == %i", valueOneOrThree,valueOneOrThree];
这就是我所需要的。
(banned & 8) == 0
。 - chadbag以下是这种技术的一个例子/应用。
假设您有一个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...
我很怀疑这个。
但是你可以使用一个枚举
来存储属性中的值,并使用直接比较而不是位掩码。
(x & bits) != 0
比(x & bits) > 0
更安全。原因是设置最高位可能会使数字变为负数。唯一的例外是当您完全确定该数字是无符号时。 - HughHughTeotl