Что означает невозможность генерировать SQL для предиката (_STRING PREDICATE_) (проблема с RHS)?
Я пытаюсь разработать приложение для iPhone с использованием Core Data, и я использую очень простой предикат для захвата объектов. (то есть атрибут_имя == строка)
Я проверил модель, чтобы убедиться, что имена атрибутов верны, и я знаю из this SO question, что RHS означает "Righthand Side", что приводит меня к "струнной" части. Я создаю строку формата, используя
NSString *predicateString = [NSString stringWithFormat:@"attribute_name==%@", string];
Затем, чтобы получить, я использую это:
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:_entityName inManagedObjectContext:managedObjectContext];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
[request setPredicate:predicate];
NSError *error = nil;
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];
Что мне не хватает? Что может вызвать эту ошибку?
Спасибо.
Ответы
Ответ 1
Вам нужно указать строку, если вы действительно хотите использовать сообщение NSString stringWithFormat:
, или вы могли бы использовать сообщение NSPredicate predicateWithFormat:
с форматированием и аргументами, потому что оно будет "делать правильную вещь" с помощью rhs в вашей ситуации ( Я бы предположил, что вы используете метод NSPredicate
без кавычек)
NSString *predicateString = [NSString stringWithFormat:@"attribute_name==\"%@\"", string];
Ответ 2
Вы делаете это неправильно. Не следует создавать строку формата.
Я предполагаю (исходя из вашей реакции на ответ @Brent), что вы делаете что-то вроде этого:
NSString *predicateString = [NSString stringWithFormat:@"foo == \"%@\"", bar];
NSPredicate *p = [NSPredicate predicateWithFormat:predicateString];
Не делайте этого.
Сделайте это вместо:
NSPredicate *p = [NSPredicate predicateWithFormat:@"foo == %@", bar];
Первое не будет выполнено, если bar
содержит символ "
. Второй не будет.