NSPredicate == запрос - PullRequest
       10

NSPredicate == запрос

1 голос
/ 27 мая 2011

Я пытаюсь использовать nspredicate для поиска управляемого объекта, значение атрибута которого равно == значению, которое я хочу проверить.

Я точно знаю, что значение находится в моей модели данных.

Это то, что я пробовал до сих пор, но число массивов результатов всегда равно нулю.

-(BOOL)checkIfFavouriteExists:(NSString *)data
{
    BOOL returnvalue;

    NSFetchRequest *fetchReq = [[NSFetchRequest alloc]init];

    NSString *attributeName = @"userid";
    NSString *attributeValue = data;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == '%@'",
                              attributeName, attributeValue];

    //setting the predicate to the fetch request 
    [fetchReq setPredicate:predicate];

    [fetchReq setEntity:[NSEntityDescription entityForName:@"Favourites" inManagedObjectContext:self.managedObjectContext]];

    NSMutableArray *resultArray = [[NSMutableArray alloc]initWithArray:[self.managedObjectContext executeFetchRequest:fetchReq error:nil]];

    if([resultArray count]>0)
    {
        returnvalue=YES;

    }    else
    {
        NSLog(@"No records");
        returnvalue=NO;
    } 

    return returnvalue;
}

EDIT

Кажется, проблема в формате моего запроса.

Это работает, хотя?

NSExpression *exprName = [NSExpression expressionForKeyPath:@"userid"];
NSExpression *exprVal = [NSExpression expressionForConstantValue:data];
NSPredicate *predicate = [NSComparisonPredicate predicateWithLeftExpression:exprName
                                                            rightExpression:exprVal 
                                                                   modifier:NSDirectPredicateModifier 
                                                                       type:NSEqualToPredicateOperatorType 
                                                                    options:0];

Я не понимаю, почему один работает, а другой нет. Они оба делают одно и то же, верно?

1 Ответ

4 голосов
/ 27 мая 2011

Не помещайте свои переменные в кавычки.Документация по основам синтаксического анализа гласит:

Переменные в одинарных или двойных кавычках (или строки переменных подстановки) приводят к тому, что переменную% @,% K или $ интерпретируют как литералстрока формата и, таким образом, предотвращает любую подстановку.

Это должно сделать это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userid == %@", attributeValue];

Подробнее о предикатах можно прочитать в Руководстве по программированию предикатов .

...