Использование переменной для имени элемента в базовом предикате данных - PullRequest
8 голосов
/ 13 февраля 2012

Я пытаюсь написать метод, который пытается получить объект на основе предиката, используя переменную (как часть NSXMLParser).Код выглядит следующим образом:

У меня есть эти переменные, определенные в классе:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

@property (strong, nonatomic) NSString *model;
@property (strong, nonatomic) NSString *element;

Теперь в методе я настроил запрос следующим образом:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:self.model inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];

Теперь проблема - то, что я хочу сделать, это:

// DOES NOT WORK
[request setPredicate:[NSPredicate predicateWithFormat:@"%@ == %@", self.element,string]];

Но это не возвращает никаких результатов.После некоторого осмотра я заметил, что работает :

 if ( [self.element isEqualToString:@"name"] ) {
     [request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", string]];
 }

Это говорит мне, что мой self.element установлен правильно (я думаю?), Но предикат не работаеткак левая часть выражения, являющегося переменной.

Я также попытался:

[request setPredicate:[NSPredicate predicateWithFormat:@"%s == %@", [self.element UTF8String],string]];

... просто чтобы посмотреть, возможно, он предпочитает строку.Я тоже не мог сделать эту работу.

Возможно ли то, что я пытаюсь сделать?Я прочитал как можно больше документации Core Data и не могу найти ни одного примера кода, который делает это таким образом, но я также не нашел ничего, что могло бы сказать, что это невозможно.

РЕДАКТИРОВАТЬ: и теперь рабочий код:

[request setPredicate:[NSPredicate predicateWithFormat:@"%K == %@", self.element,string]];

1 Ответ

14 голосов
/ 13 февраля 2012

Если вы еще этого не сделали, прочитайте Руководство по программированию предикатов , и вы сможете найти все о предикатах.

Теперь, если я правильно понял, вы хотите создать предикат между двумя строками, но первая не определенная строка, но она может измениться.
Я не использовал их раньше, но яПолагаю, что вы можете решить свою проблему, используя предикат с динамическими именами свойств.

Здесь из документации:

Имена динамических свойств
Поскольку строковые переменные заключаются в кавычки, когда они подставляются в строку формата с помощью %@, вы не можете использовать %@ для указания динамического имени свойства - как показано в следующем примере.

NSString *attributeName = @"firstName";  
NSString *attributeValue = @"Adam";  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ like %@", attributeName, attributeValue];  

Строка формата предиката в этом случае оценивается как «firstName», как «Адам».

Если вы хотите указать динамическое имя свойства, вы используете %K в строке формата, как показано в следующем фрагменте.

predicate = [NSPredicate predicateWithFormat:@"%K like %@", attributeName, attributeValue];  

Строка формата предиката в этом случае оценивается какfirstName, например "Adam" (обратите внимание, что вокруг firstName нет кавычек).

Дополнительную информацию можно найти также здесь: Сводка формата формата предиката .

...