2014-01-27 5 views
7

Я пытаюсь создать функцию, которая просматривает мой основной стек данных и возвращает количество сообщений для желаемого ключа/значения.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 к сказуемое. Как я могу это исправить?

EDIT: Для ясности мне нужно, чтобы он был как первый случай, который работает.

ответ

25

Чтобы заменить ключ в строке предиката, вы должны использовать %K, не %@:

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

От Predicate Format String Syntax documentation:

  • % @ является вар агд подстановка значения объекта - часто строка, число или дата.
  • % K - это замена var arg для ключевого пути.
+0

+1 Я никогда не знал об этом, и это на самом деле устраняет проблему, у меня был другой день, пытаясь сделать именно это. Спасибо: D – Fogmeister

+0

Ты спас мой день. благодаря – Mashhadi

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

Это работало для меня

Смежные вопросы