【问题标题】:NSPredicate problem with column nameNSPredicate 列名问题
【发布时间】:2010-10-15 12:07:59
【问题描述】:

我正在尝试使用 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];

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

【问题讨论】:

  • 这很奇怪......我也遇到过......

标签: objective-c core-data


【解决方案1】:

The Predicate Programming Guide from Apple 说:

%@ 是一个 var arg 替代 对象值——通常是字符串、数字、 或日期。

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

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

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

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

希望这能消除您的疑虑。

【讨论】:

  • FWIW 您可能希望在谓词的两边都使用 %K,因为整数替换会错误地用双引号括起来。
  • 不,值不是整数,而是 NSNumber,正如您在文档中看到的那样,它是正确的格式。
  • 谢谢,让我免于痛苦的头痛。 :)
【解决方案2】:

很奇怪,但我想我已经通过以下方式解决了它:

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

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

【讨论】:

  • 如果有人能解释为什么会发生这种情况,我将不胜感激。
  • 因为这里你给"something_id == 2",如果你让谓词格式化字符串,它会输出这个:"something_id" == 2,所以字段会变成字符串而不是字段不带引号
猜你喜欢
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多