2010-05-07 47 views
14

所以在通過Core Data Snippets看,我發現下面的代碼:如何獲取核心數據中的不同值?

... 
[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType]; 
[request setReturnsDistinctValues:YES]; 
[request setPropertiesToFetch:[NSArray arrayWithObject:@"<#Attribute name#>"]]; 

// Execute the fetch 
NSError *error; 
id requestedValue = nil; // WTF? This isn't defined or used anywhere 
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error]; 
if (objects == nil) { 
    // handle the error 
} 

這是偉大的,似乎最適合我的需要......但一個人如何實際使用它?我假設,因爲它正在返回字典,我需要一個鍵來獲取值 - 但是在哪裏定義了關鍵字?那是「id requestedValue = nil」這一行嗎?如果是這樣,那麼「requestedValue」如何成爲關鍵? Xcode給了我一個關於「requestedValue」聲明中未使用變量的編譯器警告。我覺得我在這裏錯過了一些東西。

在此先感謝您提供的任何幫助。

回答

28

requestedValue不算什麼,顯然沒有被使用(可能它是其他示例的一部分,它被剪切成&粘貼到這個示例代碼 - 誰知道)。你可以忽略它。

字典的鍵與您在模型中獲取並定義的屬性相同。因此,例如,如果您有一個人物實體,其中定義了三個屬性,名稱,年齡,phoneNumber,並且您只請求了名稱,那麼這將是您的字典中唯一包含數據的密鑰。所以:

[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType]; 
[request setReturnsDistinctResults:YES]; 
[request setPropertiesToFetch:[NSArray arrayWithObject:@"name"]]; 

// Execute the fetch 
NSError *error; 
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error]; 
if (objects == nil) { 
    abort(); 
} 
for(NSDictionary* obj in objects) { 
    NSLog(@"Person: %@", [obj objectForKey:@"name"]); 
} 
// ... 

所以,如果你有5人在名爲鮑勃,莎莉,喬,芙蕾達和Sue您的數據存儲區,你會看到這些名字打印出來。如果你想使用任何其他屬性(如他們的年齡),你必須將其添加到你在setPropertiesToFetch:中設置的數組中。

但是,在大多數情況下,最好簡單地檢索管理對象。該對象將會出現故障,因此除非實際訪問它們,否則您甚至不會將屬性帶入內存。另外,如果您想對對象進行更改,則可以將它們持久存儲到存儲中(使用託管對象)。

+1

完美 - 感謝您的幫助。核心數據片段非常有用,但如果您是新用戶,他們會留下一點想象力。 感謝您的幫助! – Andy 2010-05-07 12:02:07

+4

想象力「小」?他們將一切都留在想象中。每當我唯一的知識來源是蘋果公司撰寫的文檔時,我都會感到自己打擊自己的衝動。幸運的是,StackOverflow中有許多殺死像Jason Coco和其他人的專業人員,這些幫助我們理解Apple在他們的文檔中編寫的模糊加密消息。蘋果公司的產品很棒,但他們的文檔吸無限平方+ 1. – SpaceDog 2010-12-24 22:38:02

+2

它看起來像setReturnsDistinctValues已改爲setReturnsDistinctResults – mishod 2014-06-05 02:41:39