【问题标题】:How to use binary flags in Core Data?如何在 Core Data 中使用二进制标志?
【发布时间】:2011-06-10 15:29:11
【问题描述】:

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

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

我也想知道这是否可以通过二进制类型属性实现?

【问题讨论】:

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


    【解决方案1】:

    我几乎不怀疑。

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

    【讨论】:

    • 我不明白你的意思。我要做的是获取与某些位值匹配的实体(不限于完全相同的位序列)。
    • 您能否举例说明为什么需要位掩码技术?
    • @CiprianL。就是这样:我有一堆实体,代表生物(很多生物),我有一堆世界(比如 16 个左右),我应该将这些生物呈现到其中。相同的生物可以出现在多个世界中。所以现在,我需要获取应该出现在 ABD 的世界中的生物@
    【解决方案2】:

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

    【讨论】:

    • 这行得通!!!!非常感谢 !我也很怀疑 CodeData 是否会转换为 SQL,但我刚刚对其进行了测试,它似乎可以工作。
    • 检查(x & bits) != 0 而不是(x & bits) > 0 几乎总是更安全。原因是设置最高位可以将数字变为负数。唯一的例外是当您完全确定该号码未签名时。
    【解决方案3】:

    这是该技术的一个示例/应用。

    假设你有一个 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...
    

    【讨论】:

      【解决方案4】:

      rockfakie 几乎是对的,但是

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

      是我需要的。

      【讨论】:

      • Hnmm,我收到 CoreData 的错误“'NSInvalidArgumentException',原因:'Unsupported function expression ban & 8”,表达式为(banned & 8) == 0
      • 你能发布你的整个 NSPredicate 定义吗?
      • 已修复。由于脑放屁(一直在处理应用程序用来填充其对象并使用 mysql 列名称而不是 CD 属性名称的 mysql 端),是属性名称的愚蠢拼写错误。谢谢。
      • 这应该是正确使用%i语法的正确答案
      猜你喜欢
      • 1970-01-01
      • 2012-01-19
      • 2016-01-10
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多