2017-08-31 105 views
0

如何在多對多關係中按照「自定義」順序管理對象進行排序?看起來託管對象是以任意順序排列的,我需要按照字母順序排列name屬性。我應該擴展託管對象/實體嗎?自定義排序核心數據對多關係?

enter image description here

回答

0

是的,Core Data中的管理對象沒有特定的順序。您可以通過在獲取請求上設置sortDescriptors屬性來獲取它們。如果您已經在執行讀取操作,則比先讀取然後在內存中進行排序更快,效率更高,例如,通過調用sortedArrayUsingDescriptors

所以,如果你要獲取所有事件,你會做如下:

let fetchRequest: NSFetchRequest<Event> = Event.fetchRequest() 
fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(Event.name), 
               ascending: true)] 

或者,如果你有一個從活動到被稱爲usersWhoLiked用戶多對一對多的關係,你可以獲取該由至少一個用戶年齡超過50歲喜歡以下所有事件:

let fetchRequest: NSFetchRequest<Event> = Event.fetchRequest() 
fetchRequest.predicate = NSPredicate(format: "@"SUBQUERY(usersWhoLiked, $user, $user.age > %d)[email protected] != 0", 
       50)) 
fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(Event.name), 
               ascending: true)] 

但是,請注意,sortDescriptors僅適用於獲取請求的實體。而且,如果你根本就沒有進行抓取,例如只是訂購特定用戶的所有事件,那麼Jon Rose的解決方案可能同樣有效或更多。

目前還不清楚你想要訂購什麼。我希望這回答了你的問題。

0

的關係被定義爲一組,這是無序的。您可以將該集合轉換爲數組,然後對數組進行排序:

NSArray* sortedEvents = [user.events.allObjects sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]]