ios如何正确使用NSPredicate与核心数据进行NSString匹配?

ios如何正确使用NSPredicate与核心数据进行NSString匹配?,ios,core-data,nsstring,match,nspredicate,Ios,Core Data,Nsstring,Match,Nspredicate,我正在尝试使用以下代码将实体插入或更新(如果存在)到核心数据中: - (void)insertFriendWithDictionary:(NSDictionary *)friendInfo { NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:@"Friend"]; NSString *atributeName = @"identifier"; NSString *valueName =

我正在尝试使用以下代码将实体插入或更新(如果存在)到核心数据中:

- (void)insertFriendWithDictionary:(NSDictionary *)friendInfo {

    NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:@"Friend"];

    NSString *atributeName = @"identifier";
    NSString *valueName = [[friendInfo objectForKey:@"id"] stringFromMD5];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",atributeName,valueName ];
    req.predicate = predicate;

    req.fetchLimit = 1;
    NSError *requestError = nil;
    NSArray *tmp = [self.managedObjectContext executeFetchRequest:req error:&requestError];

    if (tmp && tmp.count >0) {
        Friend *friend = [tmp objectAtIndex:0];
        friend.name = [friendInfo objectForKey:@"name"];
        friend.identifier = [NSString stringWithFormat:@"%@",[[friendInfo objectForKey:@"id"] stringFromMD5]];
        [self saveContext];
        return;
    }   

    Friend *friend = 
    [NSEntityDescription insertNewObjectForEntityForName:@"Friend"
                                  inManagedObjectContext:self.managedObjectContext];
    friend.name = [friendInfo objectForKey:@"name"];
    friend.identifier = [friendInfo objectForKey:@"id"];
    friend.noOfMessagesReceived = [NSNumber numberWithInt:0];
    friend.email = @"";
    friend.selected = [NSNumber numberWithBool:NO];
    friend.frooiFriend = [NSNumber numberWithBool:NO];
}
但是当第二次运行代码时,谓词与任何结果都不匹配。我相信这是NSPredicate的问题

以下是为Friend生成的代码:

@interface Friend : NSManagedObject

@property (nonatomic, retain) NSString * email;
@property (nonatomic, retain) NSNumber * frooiFriend;
@property (nonatomic, retain) NSString * identifier;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * noOfMessagesReceived;
@property (nonatomic, retain) NSData * profileImage;
@property (nonatomic, retain) NSNumber * selected;
@property (nonatomic, retain) NSNumber * frooliMessagesSentTo;

@end
我做错什么了吗


谢谢

请问
[friendInfo objectForKey:@“id”]
是否等于
[friendInfo objectForKey:@“id”]stringFromMD5]


如果没有:这是您的问题,因为您正在设置
friend.identifier=[friendInfo objectForKey:@“id”]
用于新朋友,但用于搜索朋友的谓词使用
[[friendInfo objectForKey:@“id”]stringFromMD5]

[friendInfo objectForKey:@“id”]
是否等于
[[friendInfo objectForKey:@“id”]stringFromMD5]


如果没有:这是您的问题,因为您正在设置
friend.identifier=[friendInfo objectForKey:@“id”]
用于新朋友,但用于搜索朋友的谓词使用
[[friendInfo objectForKey:@“id”]stringFromMD5]

尝试使用此谓词:

[NSPredicate predicateWithFormat:@"%@ MATCHES[cd] '.*%@.*'",atributeName,valueName ];

这不是最好的表现,但它的工作。您可以在以后提高性能。

尝试使用以下谓词:

[NSPredicate predicateWithFormat:@"%@ MATCHES[cd] '.*%@.*'",atributeName,valueName ];

这不是最好的表现,但它的工作。您可以在以后提高性能。

似乎首先执行请求,然后插入对象,因此在第一次运行后,您在一个空数据结构上执行请求(结果是
0
,这是正确的),然后插入一个新的
NSManagedObject
,现在的结果将是
1
,但您没有请求当前数据库。尝试首先插入新的
NSManagedObject
,然后执行请求。你觉得呢?我觉得我用的逻辑很好。tilo指出了问题似乎首先执行请求,然后插入对象,因此在第一次运行后,在空数据结构上执行请求(结果是
0
,这是正确的),然后插入一个新的
NSManagedObject
,结果将是
1
,但您没有请求当前数据库。尝试首先插入新的
NSManagedObject
,然后执行请求。你觉得呢?我觉得我用的逻辑很好。蒂洛指出了问题所在