2011-09-24 106 views
32

如何比較NSPredicate中的兩個NSNumber或一個NSNumber和一個整數?NSPredicate與整數比較

我想:

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的整數值,那麼你需要在上游使用的NSNumber代替的NSString作爲替代的價值。看看例子:

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