gpt4 book ai didi

Swift CoreData 保存一对一关系

转载 作者:行者123 更新时间:2023-11-28 05:46:18 25 4
gpt4 key购买 nike

在下面,我尝试使用 CoreData 保存一些分段控件。看起来很简单,但只保存了最近的控制索引。其余的由于某种原因被重置为 0。我没有选中每个属性的默认设置。

Quote 是我的主要实体,与名为 worksheetWorksheet 具有一对一关系。

@IBAction func segmentPressed(_ sender: UISegmentedControl) {
let worksheet = Worksheet(context: context)

switch sender.tag {
case 0:
worksheet.irrigation = Int32(irrigationSegment.selectedSegmentIndex)
case 1:
worksheet.waste = Int32(wasteSegment.selectedSegmentIndex)
case 2:
worksheet.water = Int32(waterSegment.selectedSegmentIndex)
default:
break
}

if let quote = currentQuote as? Quote {
quote.worksheet = worksheet
appD.saveContext()
}
}

更新:我突然想到完全摆脱 switch 语句……现在它可以正确保存了。但我仍然想知道为什么要重置这些值。也许 Int 属性在保存其上下文时自动设置为零但它没有值?似乎这就是默认值设置的作用。除了我的都没有检查。

最佳答案

每次执行 segmentPressed 函数时,都会创建一个新的 Worksheet 对象(其所有属性均具有默认值)。您编写的代码(使用 switch 语句)仅设置一个属性的值,具体取决于已点击的分段控件。正如您在更新中注意到的那样,在删除 switch 语句后,您的代码更新了所有属性的值,并且一切看起来都很好。

但是,由于您每次都在创建一个新的 Worksheet 对象,因此您需要考虑旧对象发生了什么。由于关系是一对一的,当您将新的 Worksheet 分配给 currentQuote 时,旧的 Worksheet 对象的链接将被删除 - 但是旧的 Worksheet 对象仍然存在。因此,您正在构建一组“孤立的”Worksheet 对象,这些对象没有指向任何 Quotes 的链接。

为避免这种情况,您应该检查 currentQuote 是否有一个现有的 Worksheet 对象。如果是,则更新该对象的适当属性;如果没有,创建一个新的 Worksheet,设置它的属性值(您可能想要设置所有属性值)并设置与 currentQuote 的关系。像这样:

@IBAction func segmentPressed(_ sender: UISegmentedControl) {
if let worksheet = currentQuote?.worksheet {
switch sender.tag {
case 0:
worksheet.irrigation = Int32(irrigationSegment.selectedSegmentIndex)
case 1:
worksheet.waste = Int32(wasteSegment.selectedSegmentIndex)
case 2:
worksheet.water = Int32(waterSegment.selectedSegmentIndex)
default:
break
}
appD.saveContext()
} else {
if let quote = currentQuote as? Quote {
let worksheet = Worksheet(context: context)
worksheet.irrigation = Int32(irrigationSegment.selectedSegmentIndex)
worksheet.waste = Int32(wasteSegment.selectedSegmentIndex)
worksheet.water = Int32(waterSegment.selectedSegmentIndex)
quote.worksheet = worksheet
appD.saveContext()
}
}
}

关于Swift CoreData 保存一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54656158/

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