当使用两个格式字符串时,必须颠倒NSPredicate格式

时间:2014-04-21 08:55:22

标签: objective-c macos core-data nsstring nspredicate

我有一个NSManagedObject,其中包含以下属性:

  • 状态
  • 优先

现在我希望能够分别使用这些属性过滤我的实体。所以我希望我必须有这样的谓词:

status CONTAINS[c] ‘open’

我得到了非常奇怪的结果,只要我的谓词中有两个变量,并且我必须反向我的情况下kindvalue的顺序,以便我得到了预期的结果:

NSString *kind = @"status"; // DEBUGGING
NSString *value = @"open"; // DEBUGGING

// This works although it defies all logic
NSString *predicate = [NSString stringWithFormat:@"('%@' CONTAINS[c] %@)", value, kind];
self.myFilterPredicate = [NSPredicate predicateWithFormat:predicate];

然而,由于某种原因,这不起作用:

NSString *predicate = [NSString stringWithFormat:@"(%@ CONTAINS[c] ‘%@‘)”, kind, value];

1 个答案:

答案 0 :(得分:1)

我无法重现确切的问题,但通常不应使用stringWithFormat来创建谓词。一旦替换的键或值包含,它就会导致问题 任何特殊字符,如空格或引号。

更好的方法是

self.myFilterPredicate = [NSPredicate predicateWithFormat:@"%K == %@", kind, value];

%K是一个占位符,可替换为密钥路径,例如“status”。