NSPredicate具有动态密钥和价值

时间:2014-01-27 17:47:13

标签: ios core-data filter nspredicate

我正在尝试创建一个搜索核心数据堆栈的函数,并返回所需键/值的消息量。

这是我的代码:

NSFetchRequest      *messagesCountRequest = [NSFetchRequest fetchRequestWithEntityName:@"Message"];
NSEntityDescription *messageCountModel    = [NSEntityDescription entityForName:@"Message" inManagedObjectContext:_mainManagedObjectContext];

[messagesCountRequest setEntity:messageCountModel];

NSPredicate *messageCountPredicate = [NSPredicate predicateWithFormat:@"%@ == %@", key, value];

[messagesCountRequest setPredicate:messageCountPredicate];

count = (int)[_mainManagedObjectContext countForFetchRequest:messagesCountRequest error:nil];

问题是它每次都返回0。我找到了问题的根源。当有一个静态键时,谓词看起来像这样。

key == "value"

当我通过动态密钥时,它看起来像这样

"key" == "value"

因此,问题似乎是通过将NSString传递给谓词而放置的第一组双引号。我该如何解决这个问题?

编辑:为了清楚起见,我需要它像第一种情况,即有效的情况。

2 个答案:

答案 0 :(得分:27)

要替换谓​​词字符串中的,您必须使用%K,而不是%@

[NSPredicate predicateWithFormat:@"%K == %@", key, value];

来自Predicate Format String Syntax documentation

  
      
  • %@是对象值的var arg替换 - 通常是字符串,数字或日期。
  •   
  • %K是密钥路径的var arg替换。
  •   

答案 1 :(得分:0)

 let predicate = NSPredicate(format: "SELF[%@] CONTAINS %@",key,value)

这对我有用