使用Core Data / Bindings为用户可订购列表建模

时间:2011-04-05 01:48:41

标签: core-data nstableview cocoa-bindings nsarraycontroller

我正在研究围绕OS X的Core Data的学习项目。我在数据存储中有一个实体(Foo),在UI中,我使用带有绑定的NSArrayController来放置一些(名称)字段Foo对象进入NSTableView,用户可以在其中添加/删除/重命名(并可能重新排序)项目。

如您所知,Core Data存储是无序的。但是,我想从用户角度给它订购。例如。向表视图添加新行会将新Foo修复到列表末尾等。如果表允许重新排序,则会保留该顺序。

我认为我应该通过向Foo实体添加一些隐藏(即用户永远不会遇到它)“序数”字段来完成此操作,这很好。我想弄明白:

  1. 在哪里为新项目设置此“序数”字段的正确位置?现在,一个按钮正在调用阵列控制器上的add:动作,并且绑定会神奇地处理所有其他动作。 (我需要访问项目数才能正确设置。)
  2. 在删除或重新排序时,将整个结果集的序数修正的正确位置在哪里?
  3. 假设商店中的所有对象都具有合理的序数属性,我必须对UI连接做什么才能使表视图显示按该序号排序的结果?这是我可以纯粹用绑定做的事吗?我需要继承......某事吗?
  4. 感觉这是一个很常见的场景,这里的人可能会有一个现成的答案。我是Core Data和绑定的新手 - 试图摸索我的方式。不需要代码;正确方向的指针会很棒。感谢。

1 个答案:

答案 0 :(得分:2)

最简单的排序方法是确保您的实体对用户实际需要的数据进行密切建模。请记住,Core Data不是数据库系统。它是一个具有持久性选项的对象图管理系统。对象有行为。这意味着您可以将更多信息放入Core Data中,而不仅仅是数据库。

很大一部分时间,订购很自然地通过良好的实体设计实现。例如,用户需要在将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关系。

还有其他变化。

但同样,实体设计总是最好的。实体旨在模拟/模拟现实世界的对象,事件或条件。如果您考虑要模拟的真实世界,然后将其包含在实体和对象图形设计中,那么您的排序通常会自然而然地发生。