我正在研究围绕OS X的Core Data的学习项目。我在数据存储中有一个实体(Foo),在UI中,我使用带有绑定的NSArrayController来放置一些(名称)字段Foo对象进入NSTableView,用户可以在其中添加/删除/重命名(并可能重新排序)项目。
如您所知,Core Data存储是无序的。但是,我想从用户角度给它订购。例如。向表视图添加新行会将新Foo修复到列表末尾等。如果表允许重新排序,则会保留该顺序。
我认为我应该通过向Foo实体添加一些隐藏(即用户永远不会遇到它)“序数”字段来完成此操作,这很好。我想弄明白:
add:
动作,并且绑定会神奇地处理所有其他动作。 (我需要访问项目数才能正确设置。)感觉这是一个很常见的场景,这里的人可能会有一个现成的答案。我是Core Data和绑定的新手 - 试图摸索我的方式。不需要代码;正确方向的指针会很棒。感谢。
答案 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
关系。
还有其他变化。
但同样,实体设计总是最好的。实体旨在模拟/模拟现实世界的对象,事件或条件。如果您考虑要模拟的真实世界,然后将其包含在实体和对象图形设计中,那么您的排序通常会自然而然地发生。