如何在Core Data中为两个实体场景构建数据

时间:2016-10-16 10:41:11

标签: ios swift core-data

我想要这两个实体:

Payment
 - name
 - date
 - value

Day
 - date
 - value

我想使用Day实体在一天结束时保存Payment's的总数,以便更轻松地计算周/月/年平均值。

我认为这两者之间没有任何关系。我是否必须为每个实体使用上下文?或者有一种简单的方法来使用Payment实体吗?

1 个答案:

答案 0 :(得分:1)

  

我认为这两者之间没有任何关系。

您应该在日期和付款之间建立一对多关系。

enter image description here

您可以在Day实体的Relationships部分添加关系。不要忘记设置反向关系和To Many类型。

enter image description here

Day average属性的两种方法:

  1. 将其存储在CoreData中,并在每次添加新付款对象时更新。如果你需要经常阅读平均值,这将是有意义的。
  2. 您可以定义Day实体的计算属性,并使用该特定日期的所有payments动态计算它。如果您经常这样做,可能会导致性能问题,但每次插入或删除付款时都不需要更新值。
  3. P.S。你说你需要计算平均月/年。只是不要将Day的平均值用于此目的。我的意思是一个月内的平均天数不是该月付款的平均值

      

    我是否必须为每个实体使用上下文?

    不,你没有。您的实体应该生活在相同的环境中。

      

    或者有一种简单的方法可以使用Payment实体吗?

    你可以在没有Day实体的情况下完成它,只需通过实现Payment的便捷类方法,如下所示。同样,缺点是每次需要平均值时都要进行所有这些获取操作和计算,如果您经常需要它,这不是最佳解决方案。

    class func payments(from fromDate: NSDate, to toDate: NSDate) -> [Payment] {
        let predicate = NSPredicate(format: "date > %@ && date < %@", fromDate, toDate)
        //fetch and return payments with predicate
    }
    
    class func average(from fromDate: NSDate, to toDate: NSDate) -> Double {
        let payments = payments(from: fromDate, to: toDate)
        //calculate average of fetched payments
    }