如何在Core Data中使用二进制标志?

时间:2011-01-17 18:55:02

标签: iphone core-data nspredicate bit-fields nsfetchrequest

我在Core Data数据库中有一个int32属性。 我将此int用作enum位字段。

是否可以创建NSPredicate来根据二进制文件查询项目 这个int的值?像@"bitFieldAttribute & 0x0001"

这样的东西

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

4 个答案:

答案 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作为属性中存储的值,并使用直接比较而不是位掩码。