3

我正在通過圍繞OS X上的Core Data的學習項目工作。我在數據存儲中有一個實體(Foo),在UI中,我使用NSArrayController綁定將Foo對象的某些(名稱)字段放入NSTableView,用戶可以在其中添加/刪除/重命名(並可能重新排序)項目。使用核心數據/綁定建模用戶可訂購列表

如您所知,Core Data存儲是無序的。不過,我想從用戶的角度給它訂購。例如。向表視圖添加一個新行,將新的Foo修復到列表末尾,等等。如果表允許重新排序,則保持該順序。

我認爲我應該通過向Foo實體添加一些隱藏的(即用戶永遠不會遇到它)「序號」字段來實現這一點,這很好。我試圖弄清楚:

  1. 哪裏是正確的地方設置這個「序數」字段的新項目?現在,一個按鈕正在調用數組控制器上的add:動作,並且綁定以神奇方式處理所有其他動作。 (我需要訪問項目的數量才能正確設置。)
  2. 哪裏有正確的位置來修正整個結果集的序號在刪除或重新排序?
  3. 假設存儲區中的所有對象都具有合理的序號屬性,那麼必須對UI連接執行什麼操作才能使表視圖顯示按該序號排序的結果?這是我可以純粹與綁定?我需要子類...什麼?

感覺這是一種常見的情況,這裏的人們可能有一個現成的答案。我是新來的核心數據和綁定 - 試圖摸索我的方式。不需要代碼;指向正確方向的指針會很棒。謝謝。

回答

2

執行排序的最簡單方法是確保您的實體緊密模擬用戶實際需要的數據。請記住,核心數據不是一個數據庫系統。它是一個具有持久性選項的對象圖管理系統。對象具有行爲。這意味着您可以將更多信息放入核心數據中,而不僅僅是數據庫。

很大一部分時間,訂單自然是由良好的實體設計。例如,用戶需要在將Foo對象添加到圖表時對其進行排序。因此,Foo對象需要一個creationDate屬性。只需綁定creationDate屬性上的排序描述符即可完成。

最大的挑戰是任意排序,與建模數據無關。我喜歡用與實際有序實體相關的輕量級Order實體來解決此問題。

Foo{ 
    name:string 
    creationDate:date 
    order<-->Order.foo 
} 

Order{ 
    foo<-->Foo.order 
    previous<-->Order.next 
    next<-->Order.previous 
} 

正如你所看到的,Order實體的功能就像一箇舊學校的鏈表。要在該順序中插入新的Foo對象,只需在對象之間插入一個新的相關對象Order到現有的Order對象。要創建有序列表,只需從Order對象開始,該對象的previous屬性爲零,然後步行next關係,並在您通過時拉動每個foo關係。

還有其他的變化。

但是,實體設計總是最好的。一個實體是爲了模擬/模擬真實世界的對象,事件或條件。如果您想要模擬真實世界的事物,然後將其包含在實體和對象圖形設計中,那麼通常您的訂購自然會發生。

+0

感謝您的詳細和周到的答案。有很多情況下用戶數據可以任意排序,例如,待辦事項列表等。鏈接列表的想法比保持序號聰明,脆弱。 – 2011-04-11 06:06:03

+0

如果你想使用'NSFetchedResultsController',我看不出如何使用這個方法。我錯了嗎? – benzado 2011-07-15 16:31:51

+0

您不能在FRC中使用鏈接列表。相反,您只需從頂層對象開始,向下走向關係。可能看起來很複雜,但相比之下,每次更改排序時更新數據庫中每個對象的序數屬性都不是。 – TechZen 2011-07-15 18:59:39