每次在CoreData中添加新对象时如何更新属性?

时间:2014-06-06 18:18:49

标签: ios objective-c core-data ios7

我有一个核心数据模型,如下所示: Core data model

注意totalarray实体中的MonthlyYearSale属性和PCSParticularProduct关系;与one-to-many关系之后的其他实体之间的关系。

再说一遍:

PCSParticularProduct实体的total属性存储了整个月内特定产品ID中的总销售数字。

MonthlyYearSale实体的total属性根据当月的一组24个左右的产品计算的总销售额集合来存储每月总销售额。

问题:

当我在父实体的数组中添加子对象时,如何更新同一父代的total属性?我有两个实体,我希望根据添加到total关系属性中的对象更新array数字。有没有一种有效的方法呢?

2 个答案:

答案 0 :(得分:1)

您可以在managedObject子类中创建一个包装器方法,如

- (void) insertChild:(NSManagedObject *)object {

call core data method to add the object (or set the object's parent)
update total
}

或者您可以使用KVC观察子阵列的更改并通过更新总数进行响应。我建议使用包装器方法,因为它不需要实例化父类。

答案 1 :(得分:0)

您不应该使用CoreData字段来管理这些值,因为它们是计算出来的值。除非你拥有数以千计的物品并且反复计数会成为性能问题,否则通过保存它们无需获胜。但到那时你将不再使用CoreData,而是直接使用SQLite。

你可以实现以下总数:

·H:

@property (readonly) int total

的.m

- (int)total;
{
     int subTotal = 0;
     for (ProductSale sale in self.arrayOfChildren)
     {
          subTotal = subTotal + sale.value;
     }

     return subTotal;
}

它将作为一个属性工作,但每次都会给你实际值。我非常确定它需要将所有对象都读入内存,如果不是这种情况,你应该进一步研究核心数据聚合:

How to count in coredata (aggregation)?

我建议如果您需要在数据上使用类似SQL的函数(如聚合),那么您应该调查SQLite的直接使用是否是更好的选择。 CoreData over SQL更多的是以相关的方式存储模型,而不是实际的数据库:

http://www.objc.io/issue-4/SQLite-instead-of-core-data.html

也许你可以混合使用这两种方法但我不知道如果你通过CD直接同时访问同一个数据库会怎么样。