2012-01-16 10 views
3

我正在構建一個複合NSPredicate,以在iOS應用程序中使用sqlite上的核心數據進行獲取請求。一切正常,但我無法包括最後的條件。原因很簡單:我需要檢查存儲爲字符串的值是否在某個浮點範圍內。問題是條件是按字母順序檢查的,而不是根據其浮點值。這是代碼:NSPredicate:如何將字符串視爲數字?

NSString * conditionToBeAdded = [NSString stringWithFormat:@" && (%@ >= \"""%@\""") && (%@ <= \"""%@\""")", propertyName, myMinFloat, propertyName, myMaxFloat]; 
stringForPredicate = [stringForPredicate stringByAppendingString:conditionToBeAdded]; 
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:stringForPredicate]; 

是否有人知道如何建立一個NSPredicate對象能夠檢查字符串值作爲數字,要在coredata請求中使用?

謝謝。

+1

你過濾了什麼樣的對象?是否有可能採取其他方式,並在您的對象上創建只讀屬性,將字符串轉換爲NSNumber?通過這種方式,您可以完全控制案例,其中存儲的字符串不包含有效的數字。 – 2012-01-16 11:46:54

+0

這是應用程序的模型,它包含所有數據。這些對象有很多屬性,(名稱,地址,價格等),全部是NSString。到現在爲止,我通過執行沒有這種條件的過濾和過濾數組來解決問題,但速度稍慢。我試過你的解決方案,它不會工作,因爲它沒有在模型實體定義中找到屬性,這是一個好點,但我需要再次定義我的模型,創建媽媽文件,生成類並重新導入所有的數據,我猜 – user236739 2012-01-16 12:19:39

+1

你可以用一個自定義類來支持你的實體,實質上只添加只讀屬性。這可能會導致數據模型的新版本,因此需要數據遷移,這應該是可行的,因爲這兩個版本的數據模型僅在添加自定義類時纔有所不同。自動遷移應該能夠照顧到這一點,只要您擁有舊版和新版數據模型即可使用。 – 2012-01-16 13:03:04

回答

0

您會希望將該字符串更改爲數字並正確修復。字符串搜索是SLOW,應該避免。把數字放入字符串是一個很大的表現,沒有任何收穫。

至於你的實際謂詞,你可以做一個<或>比較字符串。我懷疑你在謂詞中的所有引號正在拋棄。引號在謂詞中是不需要的,除非你設置了一個常量,在這種情況下你不是。刪除它們並再次嘗試。

5

由於NSPredicates允許你使用它匹配鍵 - 值編碼方法,您可以在NSString的方法調用一樣東西:或的intValue的floatValue

NSString * conditionToBeAdded = [NSString stringWithFormat:@" && (propertyName.floatValue >= %f) && (propertyName.floatValue <= %f)", myMinFloat, myMaxFloat]; 
stringForPredicate = [stringForPredicate stringByAppendingString:conditionToBeAdded]; 
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:stringForPredicate]; 

我希望幫助。

+0

這種語法可行,但結果仍然不正確。謂詞如:attribute01.intValue <120不返回包含「50」的字符串 – Bjinse 2014-04-22 08:54:55

相關問題