Подтвердить что ты не робот

Что означает невозможность генерировать 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];

Что мне не хватает? Что может вызвать эту ошибку?

Спасибо.

4b9b3361

Ответ 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 содержит символ ". Второй не будет.