2012-07-20 81 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 ]; 

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