2010-05-30 100 views
52

我已經將一個核心數據屬性設置爲布爾值。現在,我需要設置它,但XCode一直告訴我它可能不會響應setUseGPS。iPhone:將布爾值保存到核心數據中

[ride setUseGPS: useGPS.on]; 

什麼是在覈心數據中設置布爾值的方法?我所有的其他屬性都是這樣設置的,而且它們的功能非常好。所以,不知道爲什麼布爾值不能這樣設置?

+0

退房的NSNumber – 2010-05-30 08:16:30

回答

131

核心數據「不具有」布爾類型(它確實,但它是一個NSNumber)。

所以要設置useGPS = YES的等價物。

[entity setUseGPS:[NSNumber numberWithBool:YES]]; 

和周圍的其他方式:

BOOL isGPSOn = [[entity useGPS] boolValue]; 

更新: 正如指出的SKG,隨着Objetive-C的文字,你現在可以做一個簡單的方法:

[entity setUseGPS:@YES]; 

BOOL isGPSOn = entity.useGPS.boolValue; 
+9

您可以設置的值。像這樣:'object.isGPSOn = @YES;' – guptron 2013-04-16 20:13:59

+0

顯然,在覈心數據編輯器中創建一個新的屬性時,我實際上可以在下拉列表中看到布爾類型,那麼這是什麼? – 2017-06-21 12:45:46

0

對此的「修復」(恕我直言,這是Apple SDK中的一個錯誤)是將以下代碼添加到您的CoreData生成的類。注意:如果你這樣做的一個類別,在一個單獨的文件,那麼你不必重新複製/每次再生裏面的Xcode

- (BOOL)useGPS 
{ 
    [self willAccessValueForKey:@"useGPS"]; 
    BOOL myuseGPS = [[self primitiveUseGPS] boolValue]; 
    [self didAccessValueForKey:@"useGPS"]; 
    return myuseGPS; 
} 

- (void)setUseGPS:(BOOL)newValue 
{ 
    [self willChangeValueForKey:@"useGPS"]; 
    [self setPrimitiveUseGPS:[NSNumber numberWithBool:newValue]]; 
    [self didChangeValueForKey:@"useGPS"]; 
} 
+0

編譯時會導致類型衝突。我應該改變現有的NSNumber屬性的類型嗎? – 2011-01-15 12:02:57

+0

@Daniel Wood - 不要改變現有的類型:CoreData要求它們是NSNumber。編譯警告令人惱火 - 簡單的解決方法是將上述兩種方法重命名爲「useGPSAsBool」和「setUseGPSAsBool」。注意:您仍然可以訪問該媒體資源,但現在只能將其命名爲「GPSAsBool」,例如「if(myCoreDataObject.GPSAsBool)」 – Adam 2011-01-15 15:05:13

+0

在閱讀了文檔中的以下內容之後,我決定不打擾任何這些內容,只是將代碼中的NSNumber轉換爲:「允許Core Data管理自己的存儲的優勢通常大於任何優勢直接與標量值交互「http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html – 2011-01-16 20:18:42

18

的CoreData類作爲一種替代方法的時候貼吧接受的答案,可以從一個NSNumber *打字簡單地改變爲BOOL在管理對象界面定義,如:

@property (nonatomic) BOOL useGPS; // Notice that the 'retain' is also removed as we're now dealing with a scalar rather than an NSObject 

各種替代方式進行了討論here,但Chris Hanson的反應是最有啓發我,特別是:

如果你有一個數值屬性 (包括布爾屬性)要求 那是,你可以鍵入它作爲 標量,而是和核心數據會做 正確的事:

@屬性(非原子)BOOL isDone;

即使該屬性是可選的, 仍然可以工作 - 它只會 將「不存在」與「false」混爲一談。

和更一致可可實現:

你可能想要做 的另一件事就是命名「完成」的財產,只是 指定吸氣劑「isDone。」這是 通常的可可命名約定:

@property(nonatomic,getter = isDone) BOOL done;

然後,您可以編寫「if(item.done){ ...}」或「item」。做= NO「;而 編譯器將仍然產生-isDone 的屬性的訪問

感謝克里斯,希望這可以幫助別人

+1

當我嘗試這種方法時,我看到iOS 4.x發生崩潰。下面是消息:「Property'bar'是'Foo'類的標量類型,無法爲其生成getter方法。」我已經嘗試在覈心數據模型中將屬性類型設置爲布爾值,並且我也嘗試了整數16.我以同樣的方式得到相同的崩潰。我錯過了什麼嗎?也許我會回到使用NSNumber。 – 2012-02-02 19:31:51

+2

據我所知,這不適用於NSManagedObject子類。 – teh1 2013-01-14 22:16:51