IOS и Coredata: NSPredicate не работает по запросу выборки - PullRequest
2 голосов
/ 09 ноября 2011

У меня есть следующий класс

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface Bankdaten : NSManagedObject

@property (nonatomic, retain) NSString * blz;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * https;

@end

и реализация

#import "Bankdaten.h"

@implementation Bankdaten

@dynamic blz;
@dynamic name;
@dynamic https;

@end

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

Теперь я хочу получить определенный объект, выполнив этот запрос:

-(Bankdaten*) ladeBankdaten:(NSString*) blz
{
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Bankdaten" inManagedObjectContext:moc];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(blz == '%@')", blz];
    [request setPredicate:predicate];

    NSError *error = nil;
    NSArray *array = [moc executeFetchRequest:request error:&error];
    if (array == nil) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    if( [array count] == 0 )
        return nil;
    return [array objectAtIndex:0];
}

Проблема: в этом случае массив всегда содержит нули объектов, и поэтому мой метод возвращает ноль, хотя blzПараметр должен соответствовать определенному значению в базе данных.Поэтому запрос на выборку должен быть положительным.Если я прокомментирую строку

[request setPredicate:predicate];

Так, что для этого запроса не будет задан предикат, данные будут загружены нормально, поэтому я думаю, что предикат каким-то образом используется мной неправильно.Что я тут не так делаю?

1 Ответ

7 голосов
/ 09 ноября 2011

Ваше мышление правильно. Изменить это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(blz == '%@')", blz];

до:

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

С NSPredicate вы не используете одинарные кавычки вокруг строковых параметров; ПредикатWithFormat обрабатывает это автоматически.

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

...