Iphone 如何在核心数据中使用二进制标志?

Iphone 如何在核心数据中使用二进制标志?,iphone,core-data,nspredicate,bit-fields,nsfetchrequest,Iphone,Core Data,Nspredicate,Bit Fields,Nsfetchrequest,我在核心数据数据库中有一个int32属性。 我使用这个int作为enum位字段 是否可以创建一个NSPredicate来根据二进制文件查询项目 这个int的值是多少?类似于@“bitFieldAttribute&0x0001” 我还想知道,对于二进制类型的属性,这是否可行?我几乎不怀疑这一点 但是您可以对存储在属性中的值使用enum,并使用直接比较而不是位屏蔽。NSPredicate可以处理它,但我不确定CoreData是否会接受它作为在数据存储上执行的有效谓词。将按位运算符转换为SQL查询时可

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

是否可以创建一个
NSPredicate
来根据二进制文件查询项目 这个int的值是多少?类似于
@“bitFieldAttribute&0x0001”

我还想知道,对于二进制类型的属性,这是否可行?

我几乎不怀疑这一点


但是您可以对存储在属性中的值使用
enum
,并使用直接比较而不是位屏蔽。

NSPredicate
可以处理它,但我不确定CoreData是否会接受它作为在数据存储上执行的有效谓词。将按位运算符转换为SQL查询时可能会遇到问题(如果您使用的是SQLite备份存储)。你得试试看

但是,语法正是您所期望的:

NSPredicate * p = [NSPredicate predicateWithFormat:@"(3 & 1) > 0"];
NSLog(@"%@", p);
NSLog(@"%d", [p evaluateWithObject:nil]);
日志:

对于二进制类型的属性(即定义为
data
,对吗?)这样做可能行不通。按位运算符只有在对整数进行操作时才有意义(据我所知),因此在
NSData
上执行它就没有多大意义了。先把它转换成一个数字,然后它就可以工作了

编辑


SQLite似乎支持这种语法,因为,这意味着核心数据可能也会接受它

假设您有一个NSManagedObject,它有一个带有keypath“typeValue”的整数属性

在代码的某个地方定义一个按位枚举:

typedef enum SomeType {
    SomeTypeValueOne = 0x1,
    SomeTypeValueTwo = 0x2,
    SomeTypeValueThree = 0x4
} SomeType;
现在,要查询类型为1或3但不是2的托管对象,请执行以下操作:

SomeType valueOneOrThree = SomeTypeValueOne | SomeTypeValueThree;

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

// construct NSFetchRequest as normal with predicate...

rockfakie几乎是对的但是

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

这就是我需要的。

我不明白你的意思。我想做的是获取与某些位值(不限于完全相同的位序列)匹配的实体。您能举个例子说明为什么需要位屏蔽技术吗?@CiprianL。这里是:我有一堆实体,代表着生物(很多生物),我有一堆世界(比如16个左右),我应该把这些生物呈现到其中。同样的生物可以出现在多个世界中。所以现在,我需要获取那些应该出现在世界
A
B
D
中的生物,它们都是有效的!!!!谢谢!我也很怀疑CodeData是否能转换成SQL,但我刚刚测试过,它似乎能工作。检查
(x&bits)!=0
而不是
(x位)>0
。原因是设置最高位会使数字变为负数。唯一的例外是当您完全确定数字是无符号的时。Hnmm,我收到CoreData barfing,错误为“'NSInvalidArgumentException',原因:'不支持的函数表达式禁止&8',表达式
(禁止&8)==0
,您可以发布整个NSPredicate定义吗?已修复。是由于大脑放屁而导致的愚蠢的属性名称输入错误(一直在处理应用程序用来填充其对象的mysql端,并使用mysql列名而不是CD属性名)。谢谢。这应该是正确使用
%i
NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == %i", valueOneOrThree,valueOneOrThree];