【问题标题】:NSPredicate with format has to be reversed when two format strings are used当使用两个格式字符串时,NSPredicate with format 必须颠倒
【发布时间】:2014-06-05 07:39:57
【问题描述】:

我有一个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];

【问题讨论】:

  • 我无法重现您的问题。第一个谓词字符串导致崩溃。第二个谓词无法编译,因为它包含印刷引号而不是简单引号。修复该问题后,第二个谓词字符串起作用并给出预期结果。 - 但是,正确的方法是使用self.myFilterPredicate = [NSPredicate predicateWithFormat:@"%K == %@", kind, value];
  • @MartinR 对这些角色感到抱歉。你能告诉我%K 在这个例子中做了什么吗?

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


【解决方案1】:

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

更好的方法是

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

%K 是一个占位符,将被替换为 key path,例如“status”。

【讨论】:

    猜你喜欢
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多