2010-10-14 72 views
7

我想按實體對NSFetchRequest的結果進行分組。這些實體都共享相同的抽象父項。例如:是否可以在不添加額外屬性的情況下按「NSFetchRequest」中的子類進行排序?

animal 
| 
|-cat 
| 
|-dog 

NSFetchRequestincludesSubentities設置TRUEentity設置爲animal。可以將NSFetchedResultsController的sectionNameKeyPath設置爲entity.name,但不可能對NSFetchRequestsortDescriptors做同樣的處理,因爲sortDescriptors應用於存儲的屬性(即數據庫中的數據,而不是類中的方法)。因此按實體類型分組的唯一方法是向超類添加一個屬性,子類可以用它來標識自己。

這看起來很瘋狂,因爲它破壞了繼承的有用性。我查看了SQLite數據庫,實體類型與屬性存儲在同一個表中,因此所需的數據已經就位。

總結:是否可以按NSFetchRequest中的子類進行排序而不添加其他屬性?

+0

你有沒有找到這個問題的答案? – epologee 2011-07-04 20:31:30

+0

@epologee。不,我沒有找到解決方案。我認爲最好的辦法是重新排序'fetchedResultsController.sections'或不使用'NSFetchedResultsController'。 – 2011-07-04 20:34:00

+0

我已經採取了使用多個NSFetchedResultsController實例,每個實體一個:S。收藏這個問題,如果有人找到答案。乾杯。 – epologee 2011-07-04 23:42:39

回答

2

我認爲答案是否定的。

獲取和排序發生在Store(對於SQLLite存儲)中,所以屬性需要成爲數據模型的一部分。從核心數據編程指南(Persistent Store Features):

提取和商店類型之間有一些相互作用。在XML,二進制和內存存儲中,謂詞和排序描述符的評估在Objective-C中執行,可訪問所有Cocoa的功能,包括NSString上的比較方法。另一方面,SQL存儲將謂詞和排序描述符編譯爲SQL,並在數據庫本身中評估結果。這主要是爲了性能,但這意味着評估發生在非Cocoa環境中,因此對依賴Cocoa的描述符(或謂詞)進行排序無法工作。

此外,您無法排序使用SQLite的商店瞬態特性。

相關問題