ios和coredata:NSPredicate不适用于获取请求

too*_*oom 2 core-data fetch ios

我有以下课程

#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
Run Code Online (Sandbox Code Playgroud)

和实施

#import "Bankdaten.h"

@implementation Bankdaten

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

@end
Run Code Online (Sandbox Code Playgroud)

我检查了该对象的数据是否正确地由我的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];
}
Run Code Online (Sandbox Code Playgroud)

问题:在这种情况下,数组总是包含零对象,因此我的方法返回nil,尽管blz参数必须与数据库中的某个值匹配.所以获取请求应该是正面的.如果我评论该行

[request setPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

因此没有为此请求设置谓词,数据被正确加载,因此我认为谓词在某种程度上被错误地使用了.我在这做错了什么?

Gee*_*man 7

你的想法是正确的.改变这个:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(blz == '%@')", blz];
Run Code Online (Sandbox Code Playgroud)

至:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"blz == %@", blz];
Run Code Online (Sandbox Code Playgroud)

使用NSPredicate,您不要在字符串参数周围使用单引号; predicateWithFormat自动处理.

括号很好,但除非你正在执行需要它们的谓词逻辑,否则最好将它们排除在外并尽可能简化谓词.