7

这个问题是在 Core Data 的上下文中,但如果我没记错的话,它同样适用于更一般的 SQL 案例。

我想使用 Core Data 维护一个有序表,用户可以:

  • 重新排序行
  • 在任何地方插入新行
  • 删除任何现有行

最好的数据模型是什么?我可以看到两种方式:

1)将其建模为数组:我将一个 intposition属性添加到我的实体

2)将其建模为链表:我添加两个一对一的关系,nextprevious从我的实体到自身

1)使排序变得容易,但插入或删除很痛苦,因为您必须更新position之后的所有对象

2)使插入或删除很容易,但很难排序。事实上,我认为我不知道如何ORDER BY为这种情况表达排序描述符(SQL 子句)。

现在我可以想象1)的变化:

3) 向实体添加一个 intordering属性,但不是让它一个一个计数,而是让它计数 100 乘 100(例如)。然后插入就像在前一个和下一个现有对象的顺序之间找到任何数字一样简单。只有当 100 个孔被填满时,才需要进行昂贵的重新编号。使该属性成为浮点数而不是 int 会使它变得更好:几乎总是可以在两个浮点数的中间找到一个新的浮点数。

我在解决方案 3) 的正确轨道上,还是有更聪明的方法?

4

2 回答 2

4

如果排序是任意的,即不是被建模的数据所固有的,那么您别无选择,只能添加属性或关系来维护顺序。

我会建议链接列表,因为它最容易维护。我不确定您所说的链表难以排序是什么意思,因为无论如何您都不太可能不会按任意顺序进行排序。相反,您只需获取最顶层的实例并一路向下走。

按可整除的浮点属性排序是个好主意。您可以通过从较高的现有索引中减去较低的现有索引,将结果除以 2,然后将该结果添加到较低的索引来创建几乎无限数量的中间索引。

如果您需要对表格等进行排序,您还可以将可分索引与链表结合起来。链表可以很容易地找到现有的索引,而可分割的索引可以很容易地在需要时进行排序。

Core Data 反对这种排序,因为它通常是不必要的。除非有必要模拟模型描述的真实世界对象、事件或条件,否则您不希望向数据模型添加某些内容。通常,排序/排序不是模型固有的,而只是 UI/视图需要。在这种情况下,您应该在模型和视图之间的控制器中具有排序逻辑。

当您可能不需要时,在将订单添加到模型之前请仔细考虑。

于 2010-09-05T11:53:42.000 回答
0

从 iOS 5 开始,您可以(并且应该)使用NSOrderedSet及其可变子类。→ OS X v10.7 和 iOS 5.0 的核心数据发行说明

请参阅如何在 Core Data 中保留有序列表中的已接受答案。

于 2012-09-21T09:36:05.273 回答