2011-04-21 37 views
7

我必須使用核心數據的iOS 4的項目。當我設計核心數據模型時,屬性有Integer 64,Integer 32,Integer 16,Decimal,Double,FloatBoolean如何分辨核心數據的NSNumber的屬性的類型

但在產生NSManagedObject子類,它們都是NSNumber*。所以,當我使用它,我怎麼能告訴如果NSNumberlong,一個double,一個floatBOOL

回答

8
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:myManagedObjectContext]; 
NSAttributeDescription *attribute = [[entity attributesByName] objectForKey:@"myAttribute"]; 
if ([attribute attributeType] == NSInteger32AttributeType) { 
    // We have an Integer32 
    // ... 
} 

檢查NSAttributeDescription.h頭的其他有效的屬性類型,除了NSInteger32AttributeType

+0

這就是我正在尋找的。謝謝。 – 2011-04-21 15:19:51

+0

if語句中沒有右括號。我試圖編輯但被拒絕,因爲編輯至少有6個字符,但也許你(Ole)可以編輯它,因爲你是原作者。 – 2011-06-22 06:01:02

+0

謝謝你指出,喬希。我修好了它。 – 2011-06-22 07:18:12

0

我不知道有辦法知道,而是爲了讓自己的生活更輕鬆,你可以爲每個核心數據實體類別,並添加新的getter和setter方法符合實際類型的屬性這一點。在這些setter/getters上,您必須進行數據轉換並調用生成的Core Data setter/getters。

+0

我爲什麼要這麼做的原因,是我需要解析CSV一些類似的文件。我有數百個不同的核心數據實體,我真的需要一些通用的方法,然後爲每個實體子類化。 – 2011-04-21 15:04:31

0

核心數據層只能對付的對象,你會看到不同的選項是如何將其存儲在底層數據庫。 NSNumber類可以在上述值之間自由「轉換」。只要選擇適合您的情況就行了。是一個布爾?然後保存它(在數據庫中佔用更少的空間)是否需要高精度做雙倍等等。當您在運行時處理值NSNumber將爲您處理所有事情。 所以在代碼訪問的布爾看起來是這樣的:

if([[NSManagedObject isActive] boolValue]) 

或設置:

[[NSManagedObject setIsActive:[NSNumber numberWithBool:YES]]; 
+0

我認爲這不是我要求的......我會去@Ole Begemann's – 2011-04-21 15:17:56

2

NSNumber是免費電話與CFNumber橋接和CFNumber可以這樣做:

NSNumber *someNum = [myManagedObject someNum]; 
CFNumberType t = CFNumberGetType((CFNumberRef)someNum); 

枚舉值CFNumberType告訴你數字類實際使用的類型來存儲你的值。但是這種類型不能保證是你創建數字時應該說的內容,所以如果你想知道模型的期望類型,你應該按照Ole Begemann的建議進行操作,並獲得AttributeDescription的屬性類型。