我想用下面的代碼插入或更新(如果存在)的實體到核心數據: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