核心数据@sum和@count为3表关系(一对多)

时间:2013-05-31 14:15:36

标签: objective-c core-data entity-relationship

我有以下架构:

  • 表客户:Name
  • 表格顺序:OrderDateAmount
  • 表格订单详细信息:ItemNameAmount

一对多关系就像Customer --> Orders --> OrderDetails一样 我需要分别在@sum@count表格中获取查询OrdersOrderDetails

我尝试了valueForKeyPath,但它仅适用于Orders表,无法访问OrderDetails表:

[Customer valueForKeyPath:@"orders.@sum.amount"]

我正在寻找获得Orderdetails的计数,或使用嵌套谓词得到计数(性能是一个问题),例如:

[Customer valueForKeyPath: @"orders.OrderDetails.@count.ItemName]

1 个答案:

答案 0 :(得分:2)

您的第二个不正确,因为您正在混合属性和类名并错过了一个步骤。如果您想要计算客户所有订单的订单详细信息,那么您需要做更多的工作。首先让我们看看这个,而不是将所有内容都放在一个调用中,以便更容易理解:

NSSet *orders = [customer valueForKey:@"orders"];
NSSet *details = [orders valueForKey:@"orderDetails"];
NSInteger count = [details count];

因此,它有效。但是你想要它在一条线上。为此,我们需要在尝试计数之前合并多个订单中的所有订单详细信息。上面的代码将此作为在-valueForKey:上调用NSSet的副作用。但是我们可以用KVC故意这样做:

NSSet *details = [customer valueForKeyPath:@"orders.@distinctUnionOfSets.orderDetails"];
NSInteger count = [details count];

@distinctUnionOfSets告诉KVC对来自-valueForKey:的结果调用orders并且它应该期望返回NSSet的一个或多个实例并合并内容将这些实例转换为单个NSSet并将其返回。现在唯一剩下的就是把数字放在最后:

NSInteger count = [customer valueForKeyPath:@"orders.@distinctUnionOfSets.orderDetails.@count"];

在你的代码中,你做错了两件事。您正在引用对象类名而不是实例名称(我猜对了它们应该是什么)并且您没有组合回来的集合以便计数可以正常工作。

有关KVC的更多详情,请访问Apple's Developer Website