2011-09-24 4 views
32

NSPredicate에서 NSNumber 또는 NSNumber와 Integer를 어떻게 비교할 수 있습니까?NSPredicate를 Integer와 비교

내가 시도 :

NSNumber *stdUserNumber = [NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"standardUser"]]; 
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"userID == %@", stdUserNumber]; 

글쎄,이 작동하지 않습니다 ... 사람이 그것을 어떻게 아이디어가있다? 꽤 쉽지만 아무 것도 찾을 수 없었습니다 ...

답변

82

NSNumber은 오브젝트 유형입니다. NSString과 달리 NSNumber의 실제 값은 %@ 형식으로 사용될 때 대체되지 않습니다. 정수 값을 반환하는 intValue과 같은 미리 정의 된 메서드를 사용하여 실제 값을 가져와야합니다. 그리고 우리가 정수 값을 대체하려고하므로 형식 치환자를 %d으로 사용하십시오.

술어가 있어야

predicateWithFormat:@"userID == %d", [stdUserNumber intValue]]; 
+0

정말 고마워요! 이 % d % i % @ % ... "바로 가기"목록이 있습니까? – wolfrevo

+1

...이 점이 차이를 만들어서는 안됩니다. 술어 형식 파서는 형식 문자열에서'% d'을보고,'va_list'에서'int'를 팝핑 한 다음 NSNumber에 상자에 넣습니다. –

+0

그것은 또한 내가 시도했기 때문에 이상하다. fetchRequest.predicate = [NSPredicate predicateWithFormat : @ "userID == % i", [[NSUserDefaults standardUserDefaults] integerForKey : @ "standardUser"]]]]; 그리고 그것은 작동하지 않았습니다 ... 그래서 % d이어야합니다! ... 어쨌든, 지금 작동 중입니다. – wolfrevo

2

것은 당신이 predicateWithSubstitutionVariables를 사용하는 경우 : 당신이 술어 할 값이 정수 값의 NSNumber 인은 당신은 대체 값으로는 NSString 대신 조건에서의 NSNumber를 사용해야합니다. 예를 들어보세요 :

NSPredicate *genrePredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"genreID == $GENRE_ID"]]; //if we make only one NSPredicate if would look something like this: [NSPredicate predicateWithFormat:@"genreID == %d", [someString integerValue]]; 

NSPredicate *localPredicate = nil; 
for(NSDictionary *genre in genresArray){ 
    localPredicate = [genrePredicate predicateWithSubstitutionVariables:@{@"GENRE_ID" : [NSNumber numberWithInteger:[genre[@"genre_id"] integerValue]]}]; 
} 
관련 문제