将一对多核心数据关系的前 5 个值绑定到文本字段
Posted
技术标签:
【中文标题】将一对多核心数据关系的前 5 个值绑定到文本字段【英文标题】:Bind Top 5 Values of a To-Many Core Data Relationship to Text Fields 【发布时间】:2010-07-13 20:45:11 【问题描述】:我正在使用 Core Data 制作一个代表手机账单的应用程序。我有三个实体:Bill
、Line
和 Calls
。账单可以有很多线路,线路可以有很多电话。所有这些都是建立在关系上的。现在,我有一个显示所有账单的表格视图。当您双击账单时,会出现一张带有弹出框的表格,其中列出了账单上的所有行。弹出框下方是一个包含许多标签的框,这些标签显示有关该行的各种信息。在该信息下方,我想列出该行在该月呼叫的前 5 个号码。 Lines
与Calls
有一对多的关系,它有两个字段,数字和分钟。我已将所选行的所有调用加载到NSArrayController
中,并带有正确排列值的排序描述符。如何使用此数组控制器的前 5 个值填充 5 个标签?
编辑:呼叫数组已经是唯一的,当我收集数据时,我将所有单独的呼叫合并为每个月每个号码的总分钟数。我只需要排序并显示这个组合数组的前 5 条记录。
【问题讨论】:
【参考方案1】:我可能错了(真的希望我错了),但看起来你需要对这个使用蛮力。没有set / array operators 可以提供帮助,NSPredicate 似乎也没有帮助。
我认为这实际上有点棘手,看起来您必须进行一些编码。 Core Data Programming Guide 说:
如果你直接执行 fetch,你 通常不应添加 基于 Objective-C 的谓词或排序 获取请求的描述符。 相反,您应该将这些应用于 抓取的结果。如果你使用一个 阵列控制器,您可能需要 子类 NSArrayController 所以你可以 让它不通过排序描述符 到持久存储,而是做 数据后的排序 已获取。
我认为这适用于您的情况,因为重要的是要考虑在提取请求中是否首先进行排序或过滤(当设置了提取请求谓词和排序描述符时)。这是因为您会很想使用 @distinctUnionOfObjects 集合/数组运算符。如果列表在 排序之前折叠为唯一的,则无济于事。如果它是在 排序之后应用的,您只需将 fetch 请求的限制设置为 5 即可。
鉴于文档,我不知道它是如何工作的。此外,在这种情况下,针对这个特定问题避免使用 NSArrayController 并只使用 NSTableViewDataSource 协议可能更容易,但这超出了本问答的范围。
所以,这是一种方法:
-
创建一个谓词来过滤
所选账单的订单项。*
创建一个排序描述符来排序
按电话号码排列的订单项
(希望在
内部标准化格式,否则
麻烦等待)在你的情况下通过@“call.number”。
为该行创建一个提取请求
项目实体,带有谓词和
排序描述符然后执行它**。
有了这些排序的结果,如果你能轻松地折叠和“唯一”它们,那就太好了,同样,你会很想使用@distinctUnionOfObjects。不幸的是,集合/数组运算符在这里没有任何帮助(您不能直接在 NSArray/NSMutableArray 或 NSSet/NSMutableSet 实例上使用它们)。那么它就是蛮力。
我会创建一个 topFive 数组并循环遍历结果,如果 topFive 尚不存在,则将其添加到 topFive 中,直到 topFive 有 5 个项目或直到我没有结果为止。
正如我所说,在您的 UI 中显示它(是否使用绑定)超出了本问答的范围,所以我将把它留在那里。我很想听听是否有更好的方法来做到这一点——这绝对是“看起来应该很容易,但事实并非如此”的事情之一。 :-)
*您也可以在提取过程中在您的关键路径中使用@unionOfObjects 来获取所选账单的行项目的调用次数,这可能会更有效,但我已经厌倦了打字,你就明白了。 ;-)
**在实践中,我可能会将获取请求限制在合理的范围内 - 一些账单(尤其是对企业和青少年而言)可能非常大。
【讨论】:
感谢您的回复,但是,我想我的问题有点不清楚。我已经解决了呼叫是唯一的问题。当从账单中收集数据并存储在 Core Data 中时,就会处理这些问题。我所拥有的是一个 NSArrayController,其中包含每个被调用数字的总分钟数的排序数组。我真正的问题是如何显示排序的 NSArrayController 的第一个到第五个项目。巧合的是,您的回复(尤其是@distinctUnionOfObjects)对我遇到问题的项目的另一部分非常有帮助,所以,谢谢。 哦。 :-D 在这种情况下,我认为您仍然需要执行手动提取请求。 NSFetchRequest 允许您设置限制。遗憾的是,NSArrayController 缺少这个(IMO)基本功能。以上是关于将一对多核心数据关系的前 5 个值绑定到文本字段的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Objective-C 将一对多关系数据保存到核心数据中