我有一个核心数据模型,如下所示:
注意total
和array
实体中的MonthlyYearSale
属性和PCSParticularProduct
关系;与one-to-many
关系之后的其他实体之间的关系。
再说一遍:
PCSParticularProduct
实体的total
属性存储了整个月内特定产品ID中的总销售数字。
MonthlyYearSale
实体的total
属性根据当月的一组24个左右的产品计算的总销售额集合来存储每月总销售额。
问题:
当我在父实体的数组中添加子对象时,如何更新同一父代的total
属性?我有两个实体,我希望根据添加到total
关系属性中的对象更新array
数字。有没有一种有效的方法呢?
答案 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直接同时访问同一个数据库会怎么样。