列名称的NSPredicate问题

时间:2010-10-15 12:07:59

标签: objective-c core-data

我正在尝试使用NSPredicate查询表。这基本上就是我在做的事情:

NSNumber *value = [NSNumber numberWithInteger: 2];
NSString *columnName = @"something_id";

NSLog(@"%@ == %@", columnName, value);
NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"%@ == %@", columnName, value];

NSLog打印出我期望的内容(“something_id == 2”),但谓词不起作用。 但是,如果将谓词更改为:

,则谓词可以正常工作
NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"something_id == %@", value];

那么为什么这不起作用,我该如何解决呢?

2 个答案:

答案 0 :(得分:31)

The Predicate Programming Guide from Apple说:

  

%@是一个var arg替换   对象值 - 通常是一个字符串,数字,   或约会。

     

%K是var arg替换   一个关键的路径。

     

当字符串变量时   被替换为格式字符串   使用%@,它们被包围   引号。如果你想   指定动态属性名称,使用   格式字符串中的%K。

因此,在您的情况下,您需要将%K作为键路径放入columnName,而不是%@,它将添加引号:

NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"%K == %@", columnName, value];

希望这清楚你的怀疑。

答案 1 :(得分:1)

非常奇怪,但我想通过以下方式解决了这个问题:

NSNumber *value = [NSNumber numberWithInteger: 2];
NSString *columnName = @"something_id";

NSString *predicate = [NSString stringWithFormat: @"%@ == %@", columnName, value];
NSPredicate *refQuery = [NSPredicate predicateWithFormat: predicate];