2011-07-27 32 views
9

簡化: 表中有3列名爲cards。NSPredicate等價於SQL的GROUP BY

ID packTitle長期

ID是列 - 整數從0 ..... 100個

packTitle - 字符串描述包,可以說有3種包裝PACK1,PACK2的,PACK3

術語 - 101個項目的不同未排序名稱。

通過SQL語句

select packTitle from cards group by packTitle; 

我能得到的3個項目清單。

您能否建議NSPredicate等效於SQL語句GROUP BY。我需要獲得一個數組來填充UITableView。

回答

15

CoreData是一個對象圖管理框架,而不是SQL數據存儲。因此,您應該儘快 - 讓自己脫離SQL思維模式。 NSPredicate旨在作爲對對象圖中符合條件的對象的「一個沒有驚喜的謂詞」。因此,您可以獲取與查詢匹配的所有對象,但與分組這些結果不同。如果您想要執行集合操作,請使用鍵值編碼的collection operators。核心數據可能將這些轉換爲合理的SQL,但這只是一個實現細節。

在這種情況下,就可以得到該組唯一packTitle值與

[myCards valueForKeyPath:@"@distinctUnionOfObjects.packTitle"]; 

這會給你不同的組packTitle值的myCards收藏。如果您需要Core Data存儲中的所有卡,則必須運行所有cards的查詢,然後應用此收集操作。

另一種方法是製作一個PackInformation實體,或者一些包含title屬性的實體。然後,您可以在數據存儲中只有3個這些實體,從相應的包實體引用它們。獲取全部三個(或最終數字)並獲得他們的頭銜是微不足道的。正如其他人所說,如果你想要做的是從關係數據集基本上報告,你最好直接使用SQLite。這一切都取決於您從Core Data獲得多少其他好處。

+0

非常感謝您的詳細信息,並感謝您關注我的問題。看來我需要學習鍵值編碼來理解你的答案。如何使用名爲PACK1的packTile刪除所有卡也很有趣。希望我會找到一個朝這個方向發展的答案。 – Michael

+0

NSPredicate本身與Core Data無關。它可能與陣列和其他數據庫如Realm一起使用。這就是爲什麼這是一個有效的問題,與SQL進行比較是完全正確的 – brainray

2

假設你正在使用CoreData ......根據Apple Documentation

你一定不能轉化「任意」 SQL查詢到 謂詞或提取請求。沒有辦法,例如, 轉換SQL語句,如

SELECT t1.name, V1, V2 
    FROM table1 t1 JOIN (SELECT t2.name AS V1, count(*) AS V2 
     FROM table2 t2 GROUP BY t2.name as V) on t1.name = V.V1 

成獲取請求。您必須獲取感興趣的對象,然後使用 直接使用結果執行計算,或者使用數組運算符 。

如果你需要做這樣複雜的查詢,你可能會更好地使用SQLite。

+0

謝謝您的回覆。然後我必須處理結果。 – Michael

+0

不客氣。 –