列名称的NSPredicate问题

hen*_*ett 10 core-data objective-c

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

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

NSLog(@"%@ == %@", columnName, value);
NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"%@ == %@", columnName, value];
Run Code Online (Sandbox Code Playgroud)

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

NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"something_id == %@", value];
Run Code Online (Sandbox Code Playgroud)

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

Hoa*_*ham 31

Apple的谓词编程指南说:

%@是对象值的var arg替换 - 通常是字符串,数字或日期.

%K是密钥路径的var arg替换.

使用%@将字符串变量替换为格式字符串时,它们被引号括起来.如果要指定动态属性名称,请在格式字符串中使用%K.

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

NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"%K == %@", columnName, value];
Run Code Online (Sandbox Code Playgroud)

希望这清楚你的怀疑.