I am trying to save what's in in a textfield to Core Data, but nothing happen. Nothing is saved to core data and dont know why, because is worked before.
struct LivrareView: View {
@StateObject var coreDataViewModel = CoreDataViewModel()
var body: some View {
let delivery = Binding(
get: {coreDataViewModel.savedDetails.first?.wrappedDeliveryAddress ?? ""},
set: {coreDataViewModel.savedDetails.first?.wrappedDeliveryAddress = $0})
VStack(alignment: .leading) {
Text(Texts.livrareViewText1)
.foregroundColor(.orange)
TextField("Ex", text: delivery , onEditingChanged: { _ in
coreDataViewModel.saveContext()
})
}
}
}
func saveContext() {
DispatchQueue.main.async {
do {
try context.save()
print("Savedd succesfully")
} catch let error {
print("Error is \(error.localizedDescription)")
}
self.fetchSavedMenu()
self.fetchSavedDetails()
}
}
CoreData View Model :
class CoreDataViewModel : ObservableObject {
let manager = CoreDataManager.instance
@Published var savedMenu: [LocalMenu] = []
@Published var savedDetails : [LocalDetails] = []
var countDictionary: [Int16:Int] {
savedMenu.reduce(into: [:]) {
$0[$1.id, default: 0] += 1
}
}
var savedCartToShow: [LocalMenu] {
var alreadyThere = Set<Int16>()
return savedMenu.compactMap { cart -> LocalMenu? in
guard !alreadyThere.contains(cart.id) else { return nil }
alreadyThere.insert(cart.id)
return cart
}
}
init() {
fetchSavedMenu()
fetchSavedDetails()
}
func fetchSavedMenu() {
let request = NSFetchRequest<LocalMenu>(entityName: "LocalMenu")
do {
savedMenu = try manager.context.fetch(request)
} catch let error {
print("Error fetching \(error)")
}
}
func fetchSavedDetails() {
let request = NSFetchRequest<LocalDetails>(entityName: "LocalDetails")
do {
savedDetails = try manager.context.fetch(request)
} catch let error {
print("Error fetching \(error)")
}
}
func saveContext() {
DispatchQueue.main.async {
do {
try context.save()
print("Savedd succesfully")
} catch let error {
print("Error is \(error.localizedDescription)")
}
self.fetchSavedMenu()
self.fetchSavedDetails()
}
}
public func addTask(name: String, grams: Double, price: Float, id: Int) {
let newCart = LocalMenu(context: manager.context)
newCart.name = name
newCart.grams = grams
newCart.price = Int16(price)
newCart.id = Int16(id)
saveContext()
}
}
EDITED : Added CoreDataViewModel. I have 2 entities : LocalDetails and LocalMenus. I have a list of "Food Menus" with a + sign on the right side of them, and when the buttons is pressed " addTask() " func is called.
LocalDetails is used to store data for the users, but maybe the error is that is not created an object for the LocalDetails ?
CoreData Manager :
class CoreDataManager {
static let instance = CoreDataManager()
let container : NSPersistentContainer
let context : NSManagedObjectContext
init() {
container = NSPersistentContainer(name: "OneBiteContainer")
container.loadPersistentStores { description, error in
if let error = error {
print("error loading core ddata \(error)")
}
}
print(container.persistentStoreDescriptions.first?.url)
context = container.viewContext
}
func save()
{
do {
try context.save()
print("Savedd succesfully")
} catch let error {
print("Error is \(error.localizedDescription)")
}
}
}