iphone SDK:使用核心数据对任意 tableview 行重新排序

Posted

技术标签:

【中文标题】iphone SDK:使用核心数据对任意 tableview 行重新排序【英文标题】:iphone SDK: Arbitrary tableview row reordering with core data 【发布时间】:2010-07-07 06:47:02 【问题描述】:

在使用核心数据的 tableview 中实现任意行重新排序的最佳方法是什么?对我来说似乎很明显的方法是将 Int16 类型的 rowOrder 属性添加到 tableview 中正在重新排序的实体,并在用户完成重新排序时手动迭代更新所有行的 rowOrder 属性的实体。

不过,这是一个非常不雅的解决方案。我希望有一种更好的方法,只要用户重新排序,就不需要数百次更新。

【问题讨论】:

我忘记注意的一件事是,这是针对分组表视图的。因此,例如,此处找到的答案将不起作用:***.com/questions/1648223/… 【参考方案1】:

如果排序是数据模型应该模态和存储的东西,那么排序应该是实体图的一部分。

一个好的、轻量级的解决方案是创建一个Order 实体,该实体与被订购的实际实体具有一对一的关系。为了使更新更容易,请创建一个类似于对象结构的链表。像这样的:

Order
    order:int;
    orderedObject<--(required,nullify)-->OrderObject.order
    previous<--(optional,nullify)-->Order.next;
    next<--(optional,nullify)-->Order.previous;

如果您创建自定义子类,您可以提供一个insert 方法,该方法在链中插入一个新对象,然后在next 关系中发送一条消息,并告诉每个对象将其顺序增加一,然后消息到它的下一个。 delete 方法则相反。这使得排序成为模型的组成部分并且被很好地封装。为此创建一个基类很容易,因此您可以根据需要重用它。

最大的优点是它只需要小的Order 对象就可以在内存中存活。

编辑:

当然,您可以使用另一个链接对象对其进行扩展以提供部分信息。只需将该实体与Order 实体相关联,然后提供该部分中的订单号即可。

【讨论】:

【参考方案2】:

没有更好的方法,这是公认的解决方案。 Core Data 内部没有行排序,所以你需要自己做。不过代码真的不多。

【讨论】:

以上是关于iphone SDK:使用核心数据对任意 tableview 行重新排序的主要内容,如果未能解决你的问题,请参考以下文章

iPhone SDK:带有核心数据表示例代码的 SearchDisplayController?

iPhone SDK:从核心数据填充表格视图

使用文本文件保存数据 iPhone sdk?

iPhone SDK:使用核心音频 AVAudioPlayer 更改播放速度

iPhone SDK_A table view inside a table view

核心数据独特属性