2010-03-15 66 views
6

假設我有一個父實體,其中每個實體都有一些子對象。我想讓所有的父母按他們的孩子數量排序。類似於以下僞代碼的東西:核心數據:NSFetchRequest按多對多關係排序

NSEntityDescription * entity = [NSEntityDescription entityForName:@"Parent" inManagedObjectContext:managedObjectContext]; 

[[NSSortDescriptor alloc] initWithKey:@"children.count" ascending:NO]; 
//Execute request 

有沒有一種方法使用核心數據構建像這樣的提取?如果沒有辦法做到這一點,將使用sortedArrayUsingSelector:排序_PFBatchFaultingArray批處理大小的優點?

感謝, 本

回答

5

您的查詢的工作,但(假設children出現故障)將使用鍵 - 值編碼的children財產,這反過來會觸發故障的方法(見the NSManagedObject docs的列表引發錯誤的方法以及對此行爲的討論),所以你會失去批處理和錯誤的性能優勢。

如果這對您的情況可行,您可能會考慮維護父實體的派生屬性(稱爲childrenCount),以反映與父項相關的子項的數量。這不是最乾淨的解決方案,但是如果您將其作爲NSNumber保存在父實體中,即使children出現故障,您也可以訪問它,並且可以直接對其進行排序。

+1

KVC'@ count'將在'NSSet'上執行,而不是在'NSSet'內執行,因此不會引發故障。 – 2010-03-15 19:31:44

+0

它確實會引發錯誤,因爲核心數據不會單獨對每個對象進行故障 - 它會使集合本身(或者說NSSet的具體子類)出錯。請參閱http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html#//apple_ref/doc/uid/TP30001202,在「錯誤限制對象圖的大小」下, 。 – Tim 2010-03-15 23:43:20

+3

自從事情發生變化了嗎? iOS 7拋出這種類型的排序異常:***由於未捕獲的異常'NSInvalidArgumentException',原因:'對多鍵不允許在這裏'終止應用程序 ***第一次拋出調用堆棧: – an0 2013-09-27 16:26:25