2009-07-27 36 views
6

在我的核心數據模型中,我有一個具有可選NSNumber屬性的實體。在覈心數據中存儲可選的NSNumber

如何測試,看看是否在屬性的值是否有效?

當我測試零...不起作用。

[self numberAttribute] == nil // always returns NO 

當我測試一個零值int,這是行不通的。

[[self numberAttribute] intValue] == 0 // always returns no 

由於事實上,[自numberAttribute]的intValue]回報的東西,看起來很像一個指向一個內存地址。

任何人有任何想法,我做錯了什麼?

編輯:好的,錯誤是在代碼完全不相關的部分。 NSNumber和Core Data的功能完全符合人們的預期。也就是說,我將採用建議的方法,將屬性設置爲非可選,並將0指定爲默認值。

只是把這個說明此處爲一小會兒的人誰在看這個問題,那麼我將其刪除。

+1

我還沒有足夠的代表編輯,但你的第二個代碼示例有不平衡的括號(2個開括號和3個關閉)。 – Mark 2009-07-27 14:30:15

+0

非常感謝。固定。 – mmc 2009-07-27 15:18:10

+0

numberAttribute在數據模型中被指定爲浮點數? 如何聲明numberAttribute屬性?他們的訪問器實現是什麼樣的(如果你不使用@dynamic訪問器)。 沒有這些信息,你的問題是不可能準確回答的。 – 2009-07-27 15:51:20

回答

0

如果你得到一個較大的值返回,看起來像一個指針,也許這是NaN(非數字)?

如果是這樣,你可以用檢查:

isnan([[self numberAttribute] doubleValue]) 

,或者可能是沿着NSNotFound的線(儘管可能更核心數據特定的)一些其他不變。

5

按照documentation

您可以指定一個屬性是可選的,也就是說,有一個值不是必需的。但是,通常情況下,您不鼓勵這樣做 - 特別是對於數值(通常您可以使用具有默認值的強制屬性(在模型中爲0)獲得更好的結果)。其原因是SQL對NULL有特殊的比較行爲,這與Objective-C的nil不同。數據庫中的NULL與0不同,並且搜索0將不匹配具有NULL的列。

false == (NULL == 0) 
false == (NULL != 0) 

此外,NULL在數據庫中不等於空字符串或空數據blob,或者:

false == (NULL == @"") 
false == (NULL != @"") 

所以,嘗試用NULL的測試,這是不是零。更好的是,設置一個默認值並將該屬性更改爲非可選。這就是我在模型中所做的事情,在實踐中它運行得很好。

編輯: 見上面我的意見。我嘗試創建一個未設置可選屬性的新託管對象,它是零。

BOOL isNil = ([newManagedObject numberAttribute] == nil); //equals YES 

另一個編輯: 我回來稍後,並檢查了在調試器緩存加載的對象(GDB是你的朋友!)。它試圖訪問內存地址0x0,它是NULL。

0

如果它看起來像一個指針,它可能是一個指向NSNumber實例的指針。確保核心數據模型和類之間沒有不匹配(例如NSInteger,其中NSNumber*預計)。

如果你在班上有標量,那麼你需要注意自己在setNilValueForKey: