Swift CoreData, сохраняющий отношения один-к-одному - PullRequest
0 голосов
/ 12 февраля 2019

Ниже у меня есть несколько сегментированных элементов управления, которые я пытаюсь сохранить, используя 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 голосов
/ 13 февраля 2019

Каждый раз, когда выполняется функция 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()
        }
    }
}
...