NSSet 和重复项,我需要重复项吗?

Posted

技术标签:

【中文标题】NSSet 和重复项,我需要重复项吗?【英文标题】:NSSet and duplicates, I need the duplicates? 【发布时间】:2014-11-11 08:51:07 【问题描述】:

我有一个核心数据项目,其中有几个具有关系的实体。我正在使用 NSSet 提取数据,但发现 NSSet 删除了重复项 - 至少这是我的程序中发生的情况。

我在模型中创建了实体和属性,然后创建了关联的 NSManagedObjects,以便我可以编写自定义方法。我有一个连接到实体的ArrayController 和一个连接到arrayController 的表。第 0 列显示订单,第 1 列显示该订单的总计 - 订单与商品具有一对多关系。

因此,第 2 列绑定设置为 arrayController,modelKeyPath 设置为 returnBalance 方法。

我在 NSManagedObject 中有以下方法。

-(NSString *)returnBalance

 NSSet *setTotal = [self valueForKeyPath:@"item.cost"];

 NSArray *array = [setTotal allObjects];

 double ttl = 0.0;

 for (NSNumber *d in array) 

    ttl = ttl + [d doubleValue];

 
 NSNumber *total = [NSNumber numberWithDouble:ttl];
 return [total stringValue];

除了 NSSet 删除重复项外,一切正常。我已经搜索并没有找到从关系数据中提取信息的另一种方法。有什么想法吗?

[编辑]---------------

至于 Schema,我有 3 个实体(作业、订单和项目)。具有来自 Job -> Order -> Item 的一对多关系。一份工作有很多订单,每个订单有很多项目。项目由namecost 组成。

我在窗口中有一个 2 列 NSTableView,列出了第 0 列中的订单,并希望在第 1 列中显示该订单的总计。所以一目了然,我可以看到所有订单和每个订单的总数。如果您点击一个订单,会有第二个NSTableView 显示该订单的所有商品。

从功能上讲,一切都“正常工作”...仅使用 NSSet 并不能提供所有数据(即重复数据)。

Order 实体有一个关联的 NSManagedObject,这是我放置 -(NSString *) returnBalance 方法的地方。

--[更多]-- 我尝试了更多方法,并且所有接缝都删除了重复项 - 发生了什么?

 NSArray *array = [NSArray arrayWithObjects:[self valueForKeyPath:@"item.cost"], nil];

 NSString *costString = [self valueForKeyPath:@"item.cost"];

总是一样,不是所有的数据都在那里。然而,在窗口中,第二个NSTableView 显示了所有数据——所以它就在那里。

【问题讨论】:

是的,这就是NSSet 的定义。如果您解释您的架构以及您实际想要完成的工作,也许您会得到更好的帮助。 【参考方案1】:

您不需要方法。订单总成本的关键路径是item.cost.@sum

【讨论】:

感谢您的回复。我已经尝试过了,我收到一个错误。 item.cost.@sum 产生一个...is not supported. key path: cost.@sum。使用@sum.item.cost 会产生类似的错误...is not supported. Key path: cost。我把所有东西都绑定了,所以不知道为什么,这可能是一个不同的问题。我想使用一种方法,以便在需要时可以更灵活地操作数据。如果不使用fetchRequest,就没有办法将ALL数据从实体拉到数组吗? 你不能有重复的项目,所有的数据都在集合中。 cost 是字符串还是数字? 成本是一个数字。我目前的解决方案是使用 NSFetch,但想看看是否有更好的方法。

以上是关于NSSet 和重复项,我需要重复项吗?的主要内容,如果未能解决你的问题,请参考以下文章

NSSet 在使用 SetWithArray 时如何比较数组中的值以删除重复项

NSCountedSet 在 UITableView 中重复和计数

从表中的多个重复项中删除特定记录

选择语句以查找某些字段的重复项

比较其中 1 个 NSarray 和 1 个 NSset 计数重复

Swift 1.2 -> NSSet -> 不兼容的类型 [重复]