我想用下面的代码插入或更新(如果存在)的实体到核心数据: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',这是正确的),然后插入一个新的'NSManagedObject' ,现在结果是'1',但是你没有请求当前的数据库。尝试首先插入新的NSManagedObject,然后执行请求。你怎么看? – holex 2012-07-20 14:53:18
我认为我使用的逻辑很好。吐罗指出了问题 – user1078065 2012-07-20 15:12:23