【问题标题】:NSNumber property of NSManagedObject with NSPredicateNSManagedObject 的 NSNumber 属性和 NSPredicate
【发布时间】:2014-12-23 05:24:17
【问题描述】:

这里我在核心数据中有属性(name :- universal_Id)作为模态类中的NSNumber

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"universal_Id == %d",0];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"universal_Id == %d",[NSNumber numberWithInt:0]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"universal_Id == %@",[NSNumber numberWithInt:0]];

请为上述谓词提供一些正确的解决方案。哪一种是基于universal_Id 获取数据的正确方法?

【问题讨论】:

    标签: ios objective-c nspredicate nsmanagedobject


    【解决方案1】:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"universal_Id == %d",0]; 是正确的,因为 Core Data 是 ORM 并使用对象来表示标量值。所以当你需要在核心数据中存储数据时,你需要使用对象。在谓词构建中,这里不需要使用对象,标量值足以构建谓词,因为最终核心数据查询匹配的是universal_Id值,而不是对象。

    更新

    你也可以使用

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.universal_Id == %d",0];
    

    【讨论】:

    • 嗨 Sandeep,那为什么我们不能使用下面的谓词? NSPredicate *predicate = [NSPredicate predicateWithFormat:@"universal_Id == %d",[NSNumber numberWithInt:0]];
    • @mitultrivedi 在这里,您将格式说明符用于标量类型并提供对象类型的参数,您也可以使用它,但为避免出现警告,您应该使用整数类型。如果你想使用 Object 作为参数,你可以使用,但另一方面,你需要将 %d 更改为 %@。
    • 所以最终的语法会像 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"universal_Id == %d",[NSNumber numberWithInteger:0]]; OR NSPredicate *predicate = [NSPredicate predicateWithFormat:@"universal_Id == %@",[NSNumber numberWithInteger:0]];
    • NSPredicate *predicate = [NSPredicate predicateWithFormat:@"universal_Id == %d",[NSNumber numberWithInteger:0]];使用此行 [NSNumber numberWithInteger:0] 将自动取消装箱。第二行 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"universal_Id == %@",[NSNumber numberWithInteger:0]];不需要拆箱。使用第二个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多