2011-06-07 79 views
21

我有(我猜的)典型的問題只選定的屬性獲取。我的核心數據數據庫包含表格,其中包含BLOB字段和相當長的文本字段。是否有可能在覈心數據查詢

通常我不需要加載agrresivly那些大尺寸的字段。由於數據庫中有數千條記錄,我寧願僅提取我真正需要的數據。換句話說,我想讓「SELECT name,id FROM TAB_NAME」查詢,而不是「SELECT * FROM TAB_NAME」查詢。

有什麼辦法來獲取使用核心數據僅選定字段?或者我應該尋找其他選擇,例如,將大型字段分隔到另一個表中?也許有更好的(更簡單)的方法來做到這一點?

我習慣於使用Hibernate或JPA,在通過核心數據文檔處理之後,很容易做到上述操作,但我沒有看到這樣的選項。

回答

34

換句話說,我想讓「SELECT name,id FROM TAB_NAME」查詢,而不是「SELECT * FROM TAB_NAME」查詢。

回答這個問題被接受,但僅供參考,這裏是如何取得與核心數據實體的只有特定的性能,而無需重新分解模型:

// build your NSFetchRequest 
// ... 

[request setResultType:NSDictionaryResultType]; 
[request setPropertiesToFetch: 
    [NSArray arrayWithObjects:@"property1", @"property2", /* etc. */ nil]];  

又見文檔NSFetchRequest

+0

Thenks,這正是我需要的 – 2011-06-08 07:59:11

+0

BTW,根據文檔,你應該通過'NSPropertyDescription'對象的數組。 – 2013-03-19 14:15:51

+1

@RudolfAdamkovic在'NSFetchRequest.h'頭文件來看,它實際上表明,該陣列可*或者*'NSPropertyDescription' *或*'NSString'對象的集合。 – 2013-07-05 05:54:07

3

核心數據已經以faulting的形式進行「延遲加載」:故障只會在需要時從存儲中提取數據,這會減少內存和性能開銷。另請參閱Core Data Performance文檔以獲取更多信息:

BLOB通常代表實體的屬性 - 例如,照片可能是Employee實體的屬性。對於小到中等大小的BLOB(和CLOB),您應該爲數據創建一個單獨的實體,並創建一對一的關係來代替該屬性。例如,您可以使用它們之間的一對一關係創建員工和照片實體,其中從員工到照片的關係將替換員工的照片屬性。這種模式最大限度地提高了對象斷層的好處(參見「斷層和斷層」)。只有在實際需要的情況下(如果關係被遍歷),才能檢索任何給定的照片。

+3

是的,但斷層將獲取給定對象的所有領域,對不對?從文檔中:「如果您向Department對象發送一條消息以獲取其名稱,則會觸發故障 - 在這種情況下,Core Data將爲您執行一次提取以檢索所有對象的屬性。」 – 2011-06-07 07:51:52

+0

你說得對。請參閱編輯答案。 – 2011-06-07 08:04:48

+1

它看起來像安德烈是正確的,錯誤是關於延遲加載關係 – 2011-06-07 08:05:18

3

我認爲在這種情況下,你可能要保持在一個單獨的實體較大的領域(你不想加載的),只是建立一個1:爲1的關係。這樣,即使你錯誤的對象,你只會獲取「更輕」的屬性,並獲取你使用關係較重的屬性。