23

int32在核心数据数据库中有一个属性。我将其int用作enum位字段。

NSPredicate是否可以根据此 int 的二进制值创建查询项目?像@"bitFieldAttribute & 0x0001"什么?

我还想知道这是否可以使用二进制类型属性?

4

4 回答 4

30

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 也可能会接受它。

于 2011-01-17T19:52:41.583 回答
10

rockfakie 几乎是对的,但是

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

是我需要的。

于 2013-02-05T19:54:06.990 回答
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...
于 2011-08-26T15:36:52.127 回答
-1

我几乎不怀疑。

但是您可以将 anenum用于存储在属性中的值,并使用直接比较而不是位掩码。

于 2011-01-17T19:00:28.350 回答