Struggling with picker and date picker

Viewed 42

I'm really trying to get DatePicker and Picker values saved into CoreData on my app and am not having any luck. I have a 'AddEntryView' which had a user form to fill out with textfields, the date picker, pickers, and then toggles. I've successfully saved the textfields and toggles into core data and read it, but the pickers I can't figure out. My picker values are set in another file called PickerValues.swift. I’ve confirmed using print to console that the values are being set to sleep model but then whenever I try to print on the log view using record.sleepPosition etc (same that I use for the TextFields), it gives me an error. Any changes to the coding or help is greatly appreciated as ive been stuck on this for over a week.

AddEntryView.swift

    @State var hoursSleptString = String()
    @State var ahiReadingString = String()
    @State var leaksReadingString = String()
    @State var humidityReadingString = String()
    @State var eprReadingString = String()
    @State var todaysDateString = Date()
    @State var headacheToggleBool = Bool()
    @State var smartStartToggleBool = Bool()
    @State var maskSelect: PickerValues.MaskType = .full
    @State var hoursMaskSelect: PickerValues.HoursMask = .allnight
    @State var feelingSelect: PickerValues.Feeling = .great
    @State var positionSelect: PickerValues.SleepPosition = .back
    
    
    // Fuction for when button is pushed, saves data to CoreData
    private func saveSleepModel() {
        guard let hoursSleptDouble = Double(hoursSleptString) else {
            print("hours slept is invalid")
            return
        }
        guard let ahiReadingDouble = Double(ahiReadingString) else {
            print("ahi reading is invalid")
            return
        }
        guard let leaksReadingDouble = Double(leaksReadingString) else {
            print("leaks reading is invalid")
            return
        }
        guard let humidityReadingInt = Int16(humidityReadingString) else {
            print("humidity reading is invalid")
            return
        }
        guard let eprReadingInt = Int16(eprReadingString) else {
            print("epr reading is invalid")
            return
        }
        
        // Creates Sleep Model for user input & sends parameters
        var sleepModel =  SleepModel(todaysDate: todaysDateString, hoursSlept: hoursSleptDouble, ahiReading: ahiReadingDouble, leaksReading: leaksReadingDouble, humidityReading: humidityReadingInt, eprReading: eprReadingInt, headacheToggle: headacheToggleBool, smartStartToggle: smartStartToggleBool, sleepPosition: positionSelect.rawValue, feeling: feelingSelect.rawValue, maskType: maskSelect.rawValue, hoursMask: hoursMaskSelect.rawValue)
        
        coreDataViewModel.saveRecord(sleepModel: sleepModel) {
            print("Success")
            print(todaysDateString)
            print(positionSelect)
            print(maskSelect)
            print(feelingSelect)
            print(hoursMaskSelect)
        }
    }

CoreDataViewModel.swift

import SwiftUI
import CoreData

class CoreDataViewModel: ObservableObject {
    
     
   let container: NSPersistentContainer
    @Published var savedRecords: [SleepEntity] = []
    init() {
        container = NSPersistentContainer(name: "SleepContainer")
        container.loadPersistentStores { description, error in
            if let error = error {
                print("Error loading contaienr - \(error.localizedDescription)")
            } else {
                print("Core data loaded successfully")
            }
        }
     fetchRecords()
    }

    
    func saveRecord(sleepModel: SleepModel, onSuccess: @escaping() -> Void) {
        let newRecord = SleepEntity(context: container.viewContext)
        newRecord.todaysDate = sleepModel.todaysDate
        newRecord.hoursSlept = sleepModel.hoursSlept
        newRecord.ahiReading = sleepModel.ahiReading
        newRecord.leaksReading = sleepModel.leaksReading
        newRecord.humidityReading = sleepModel.humidityReading
        newRecord.eprReading = sleepModel.eprReading
        newRecord.headacheToggle = sleepModel.headacheToggle
        newRecord.smartStartToggle = sleepModel.smartStartToggle
        newRecord.maskType = sleepModel.maskType
        newRecord.feeling = sleepModel.feeling
        newRecord.sleepPosition = sleepModel.sleepPosition
        newRecord.hoursMask = sleepModel.hoursMask
        saveData(onSuccess: onSuccess)
    }
  
    func saveData(onSuccess: @escaping() -> Void) {
        do {
            try container.viewContext.save()
        //    fetchRecords()

            onSuccess()
        } catch let error {
            print("Error saving items: \(error)")
        }
    }
    func fetchRecords() {
            let request = NSFetchRequest<SleepEntity>(entityName: "SleepEntity")
            request.sortDescriptors = [
                   NSSortDescriptor(keyPath: \SleepEntity.id, ascending: false)
               ]

            do {
                savedRecords = try container.viewContext.fetch(request)
            } catch let error  {
                print("Error fetching requests - \(error.localizedDescription)")
            }
        }
    
}
0 Answers
Related