2012-07-20 80 views
0

我想用下面的代码插入或更新(如果存在)的实体到核心数据:ios如何正确使用NSPredicate与Core Data进行NSString匹配?

- (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]; 
} 

但runiing代码的第二次时,谓语没有任何结果相符。我相信这是NSPredicate的一个问题。

这里是朋友生成的代码:

@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 

难道我做错了什么?

感谢

+0

它似乎首先执行请求然后插入对象,因此在第一次运行后,您在空数据结构上执行请求(结果为'0',这是正确的),然后插入一个新的'NSManagedObject' ,现在结果是'1',但是你没有请求当前的数据库。尝试首先插入新的NSManagedObject,然后执行请求。你怎么看? – holex 2012-07-20 14:53:18

+0

我认为我使用的逻辑很好。吐罗指出了问题 – user1078065 2012-07-20 15:12:23

回答

3

[friendInfo objectForKey:@"id"]等于[[friendInfo objectForKey:@"id"] stringFromMD5]

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

+0

大声笑。你是对的 – user1078065 2012-07-20 15:03:14

0

尝试使用这个谓词:

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

这不是最好的性能,但它的工作原理。之后你可以提高性能。