2013-05-11 134 views
1

似乎無法找出在將獲取限制爲多個屬性時從關係中獲取屬性的技巧。在下面的代碼中,「thumbnail」是實體「Photo」的可轉換的UIImage屬性。在關鍵「縮略圖」的字典數組中,這總是可以恢復正常。我無法弄清楚的是第二個屬性/屬性,其中「previewImage」是Photo中另一個名爲「Image」的實體,具有可變形屬性「uiImage」(它是UIImage)。核心數據:獲取關係屬性

我已經試過這樣:

[fetchRequest setPropertiesToFetch:@[@"thumbnail", @"previewImage.uiImage"]]; 

,但我得到這個錯誤:

-[NSExpressionDescription valueTransformerName]: unrecognized selector sent to instance 0x13078920 

,我已經試過這樣:

[fetchRequest setPropertiesToFetch:@[@"thumbnail", @"previewImage"]]; 

在那裏我得到兩個項目在每個字典中

{ 
    previewImage = "0xbabba90 <x-coredata://03FF7129-1345-4BAE-A74E-2FF5A2B38CDC/Image/p5>"; 
    thumbnail = "<UIImage: 0xbabbc60>"; 
} 

,但是當我嘗試使用「圖像」對象,如下

NSDictionary *dict = [self.photos objectAtIndex:0]; 
Image *theImage = (Image *)[dict objectForKey:@"previewImage"]; 
[self.delegate photoCollectionViewController:self didSelectPreviewImage:theImage.uiImage]; 

我得到這個錯誤

"[_NSObjectID_48_0 uiImage]: unrecognized selector sent to instance 0xbabba90" 

而且我甚至拋出這在要求

[fetchRequest setRelationshipKeyPathsForPrefetching:@[@"previewImage.uiImage"]]; 

所以,我想我是甩手而沒有得到這個。任何幫助,將不勝感激。謝謝!

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Photo" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setResultType:NSDictionaryResultType]; 
+0

對'_NSObjectID_48_0'的引用表明你在某處使用了'NSManagedObjectIDResultType',儘管你的代碼表示爲'NSDictionaryResultType'。你是否在某處要求提供對象ID? – 2013-05-11 19:57:12

+0

不,我在整個項目中搜索了「NSManagedObjectIDResultType」,但沒有任何內容。我甚至不知道你可以改變結果類型,直到我試圖限制提取的屬性:)順便說一句,我有你的書;) – user1139479 2013-05-11 20:26:01

回答

1

隨着NSDictionaryResultType您可以方便地獲取實體的屬性。它不適用於遍歷關係。這就是爲什麼當你做出合乎邏輯的事情時你會得到一個錯誤:要獲取previewImage.uiImage

從文檔:

The property descriptions may represent attributes, to-one relationships, or expressions.

也許你仍然在數據庫中查詢,讓您有選擇性地選擇了「田」獲取的角度思考。在Core Data中這不是必需的,它是一個對象圖,而不是數據庫。請致電NSManagedObject s。如果你擔心記憶,你不應該這樣做。核心數據使用一種稱爲錯誤的機制來僅提取它所需的內容。事實上,上述神祕的"<x-coredata://03FF7129-1345-4BAE-A74E-2FF5A2B38CDC/Image/p5>"與在控制檯中顯示故障的方式非常相似。

嘗試使用普通實體進行抓取。你可以期待它「只是工作」。

+0

是的,我回到了「老」的方式。我試圖過於「聰明」,因爲我在Photo上有一些屬性,例如NSData,因爲我不想獲取或錯誤的圖像(這實際上是我現在在另一個實體中具有uiImage的原因)。所以,Photo的其他屬性現在都是輕量級的。但是,我仍然想知道如何去做:) – user1139479 2013-05-11 20:07:28

+0

你可以做到這一點,但你必須使用** 2 **提取。我認爲如何做到這一點應該是顯而易見的。看到我的編輯回答解釋爲什麼你不能在一個。 – Mundi 2013-05-11 20:19:25

+0

不過,你應該標記正確的答案。 – Mundi 2013-05-13 09:30:02