Swift CoreData保存一对一关系

时间:2019-02-12 18:07:22

标签: swift core-data save one-to-one

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

Quote是我的主要实体,并且与Worksheet具有一对一的关系,称为worksheet

@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属性会自动设置为零,但是它没有任何值?看起来这就是默认值设置所要执行的操作。除了我的人都未被检查。

1 个答案:

答案 0 :(得分:1)

每次执行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()
        }
    }
}