Swift - 使用for循环将数据添加到核心数据

时间:2017-09-25 17:05:25

标签: ios swift core-data nsmanagedobject

我有两个实体:

AgendaEvent

AgendaDate

AgendaEvent与AgendaDate(关系名称)有一对多的关系 是议程日期。

议程日期只有一个属性(日期类型为agendaDates)。

我正在尝试将数组的所有值保存到Agendadate中。

这种保存可能以两种不同的方式发生。

  1. 用户正在创建新的AgendaDate(所以新的上下文)
  2. 用户正在更新现有的AgendaDate
  3. 这是我的代码:

    var agendaDateToEdit: AgendaDate // this value is passed through a segue if the user clicked to modify an existing one.
    var dateToAdd: AgendaDate!
    if agendaDateToEdit == nil {
                dateToAdd = AgendaDate(context: context)
            } else {
                dateToAdd = agendaDateToEdit
            }
    

    现在我执行for循环以从数组中插入项目:

    let agendaEvent: AgendaEvent!
    
    if agendaEventToEdit != nil {
      agendaEvent = agendaEventToEdit
    } else {
      agendaEvent = AgendaEvent(context:context)
    }
    
    for date in dates {
        dateToAdd.agendaDates = date
        agendaEvent.addToAgendaDates(dateToAdd)
        ad.saveContext()
     }
    

    但是这样我只存储了数组的最后一个值。

    我是swift的新手,我真的不明白错误在哪里。 如果有人可以提供帮助,我将非常感激。

    谢谢!

1 个答案:

答案 0 :(得分:0)

dateToAdd定义在for循环的范围之上,因此它在循环的每次迭代中都会存在...

  1. 您创建或指定dateToAdd
  2. 首先通过循环开始
    1. dateToAdd的日期设为date
    2. dateToAdd附加到agendaEvent
    3. 上下文已保存
  3. 接下来开始循环
    1. 日期再次设置在dateToAdd上(这会更改agendaEvent中已有的副本中的日期)
    2. agendaEvent被告知要添加它刚刚添加的相同的 dateToAdd,因为该实体已经在agendaDates
    3. 列表中
    4. 保存上下文,for循环继续,直到日期用完为止。
  4. 核心数据中的多对多关系与NSSet一起存储,确保每个项目只存在一次。这就是为什么你只有一个AgendaDate添加到事件中。

    由于您持有一个AgendaDate实例并不断更改其日期,因此您可以看到日期数组中的最后日期。如果您在循环中添加断点,您应该会看到AgendaDate中的AgendaEvents轮流获取每个日期。

    如果你每次循环创建一个新的dateToAdd,我预测你会看到更好的结果

    for date in dates {
        let dateToAdd = AgendaDate(context: context)
        dateToAdd.agendaDates = date
        agendaEvent.addToAgendaDates(dateToAdd)
        ad.saveContext()
    }