0

我已经研究了一段时间,我认为有很多解决方案,但我不确定它们是否那么好。可能是我错过了什么:-)

我有两张桌子。对于 TableA 中的每条记录,TableB 中都有多条记录。即一对多的关系。我已经将它映射到核心数据中并生成了类。到现在为止还挺好。

我的基于表格视图的 UI 需要如下所示:

Section 1
Cell 1: Table A: field1
Cell 2: Table A: field2
-----
Section 2
Cell 1: Table B: record 1: field1
Cell 2: Table B: record 2: field1
....

当我在我tableView:cellForRowAtIndexPath:的时候,很容易处理第 1 节单元格,因为它们是来自单个表 A 记录的不同字段。第 2 节单元格不同。每次tableView:cellForRowAtIndexPath:调用我都需要从表 A 的 NSSet 中获取正确的表 B 记录。这就是问题所在。

NSSet doco表示不保证订单。这意味着如果我想要基于索引的特定记录,我有几种可能的技术:

  • 向核心数据查询添加排序描述符,并使用快速枚举获取我想要的记录。我不知道这是否可行,因为我们仍在使用 NSSet。
  • 在获取数据后使用排序描述符对 NSSet 进行排序以生成 NSArray 并将其存储在属性中,然后再开始加载表。
  • 我现在正在考虑第三种选择,即为 NSSet 编写一个装饰器,它的作用类似于 NSArray,并允许我指定一个排序字段并自动跟踪对 NSSet 的更改。棘手,但从长远来看可能会有所回报。

这些答案似乎都不是那么好。有一个更好的方法吗?

4

2 回答 2

1

如果您只想要您的对象,请使用 NSSet 访问器。

如果您希望对对象进行排序,请设置 NSFetchRequest 并添加适当的 NSSortDescriptors。

然后,只需执行获取executeFetchRequest:error:

更好的是,由于这是专门针对 tableView 的,所以使用 NSFetchedResultsController 来填充 table view。这就是它的用途。

于 2011-02-27T18:37:55.523 回答
0

我最终将 NSArray 存储在控制器中并将 NSSet 记录排序到其中。

于 2011-02-11T01:25:01.403 回答