2011-02-06 125 views
12

我正在寫一個iOS應用程序,它具有人員記錄存儲,並需要顯示列出他們以特定方式排序。這些排序的數量是可變的,並且它們是即時生成的,但我希望它們存儲在數據存儲中。執行此操作的SQL方法是使ListPositions表具有列表名稱,個人表中的id以及排序鍵。然後,要顯示一個特定的列表,我可以選擇帶有給定名稱的所有列表ListPositions,拉入引用的人員,並對排序鍵進行排序。試圖在CoreDatat中做到這一點,但我遇到了問題。我試圖做到這一點使用的模式,如:核心數據排序對多關係

Person: 
    Name 
    DOB 
    etc... 
    positions -->> ListPosition 

ListPosition: 
    listName 
    sortKey 
    person --> Person 

然後,我可以得到所有在給定列表中的人與NSPredicate [NSPredicate predicateWithFormat:@"ANY positions.listName like %@", someList]; 這使我動態地添加列表針對一大組人的。問題是我無法使用ListPosition的sortKey字段對人員進行排序。 NSSortDescriptor會做什麼?如果無法對一對多關係的一個元素的屬性進行排序,那麼在coredata中獲得多個動態排序的另一種方法是什麼?我用NSFetchedResultsController顯示列表,所以我不能把列表放在一起。我需要用一個NSFetchRequest來完成它。

+0

一些更好的格式化會讓閱讀你的問題變得更容易。 – vikingosegundo 2011-02-06 20:46:48

+0

給我們你的代碼! – vikingosegundo 2011-02-06 21:17:45

回答

3

你是對的 - 遵循一對多的關係返回一個NSSet,它沒有固有的排序。要獲得排序結果,有幾個選項:

  1. 假設Person/ListPosition是雙向關係,請爲ListPosition實體執行新的獲取請求。在來自ListPosition的「人」關係上進行謂詞匹配,看起來像[NSPredicate predicateWithFormat:@"person=%@", myPerson]。在獲取請求上使用您需要的任何排序描述符。
  2. 按照你所做的關係,給你一個NSSet。然後使用NSSet的-sortedArrayUsingDescriptors:方法將其轉換爲排序數組。
+0

我不清楚。我的問題不是如何在一對多關係中對對象進行排序,而是如何爲大量對象提供許多不同的排序順序。我編輯了這個問題。 – wombat57 2011-02-06 23:03:08

1

我認爲在這種情況下最好的方法是在ListPosition實體上取而代之。爲sortKey添加排序描述符(在這種情況下它將起作用,因爲獲取請求位於ListPosition實體上),並使用setRelationshipKeyPathsForPrefetching爲獲取請求上的「person」預取與列表名稱關聯的Person。

[NSPredicate predicateWithFormat:@"listName like %@", someList]; 
1

如果我正確理解你的模型中,每個Person對每個它所參與列表中的一個ListPosition。假設我們有他們的名字的列表,所以X人有X列表職位相同listNamesortKey

我將創建實體List,它將包含sortKey屬性,然後在排序描述符中使用它。

entity List: 
    - sortKey : string 
    - ascending : bool 

創建排序描述符,並在使用它獲取請求:

[NSSortDescriptor sortDescriptorWithKey:chosenList.sortKey ascending:chosenList.ascending]; 

然後,只要你想,你可能有多達列表,您可以輕鬆地使用它的排序鍵對所有的人進行排序。


如果你想存儲在數據庫中的位置(你沒有在你的ListPosition提到屬性index,或任何類似),您可以創建「聯合實體」:

entity PersonInList: 
    - index : integer 
    - person -> Person 
    - list –> List 

另一個想法在List實體中直接訂購了一組Person對象。

0

我通常將一個索引字段(鍵入NSNumber)添加到一個實體。在添加項目時計算索引非常容易。只是通過

object.index = person.positions.count 

所以,實際上你不需要職位領域,但職位關係。將個人實體連接到ListPosition實體就足夠了。

1

獲取ListPosition(它將作爲NSMutableSet出現)。然後對Set進行排序,像這樣:

NSMutableSet *positionsSet = [personEntity mutableSetValueForKey:@"positions"]; 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"yourSortKey" ascending:NO]; 
NSArray *positionsSortedSet = [positionsSet sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

這將根據您的密鑰爲您提供一個整理好的數組。