gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:01:57 25 4
gpt4 key购买 nike

我有两个实体:

议程事件

议程日期

AgendaEvent 与 AgendaDate 具有一对多关系(关系名称是 agendaDates)。

Agenda Dates 只有一个属性(日期类型的 agendaDates)。

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

这种节省可能以两种不同的方式发生。

  1. 用户正在创建一个新的 AgendaDate(因此是一个新的上下文)
  2. 用户正在更新现有的 AgendaDate

这是我的代码:

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 的新手,我不太明白错误在哪里。如果有人可以提供帮助,我将不胜感激。

谢谢!

最佳答案

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

  1. 您创建或分配 dateToAdd
  2. 首先通过循环开始
    1. dateToAdd 的日期设置为date
    2. dateToAdd 附加到 agendaEvent
    3. 上下文得到保存
  3. 下一个循环开始
    1. 日期再次设置为 dateToAdd(这会更改已在 agendaEvent 中的副本中的日期)
    2. agendaEvent 被告知添加它刚刚添加的 same dateToAdd 它忽略了它,因为该实体已经在其 列表中议程日期
    3. 上下文得到保存,for 循环继续,直到用完日期。

Core Data 中的多对多关系存储在 NSSet 中,确保每个项目只存在一次。这就是为什么您只能将一个 AgendaDate 添加到事件中。

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

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

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

关于ios - Swift - 使用 for 循环将数据添加到核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46410543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com