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)")
}
}
}