From 0814f73069a6ef26b67770791890543b47bcdc9a Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Mon, 3 Oct 2022 21:19:10 -0700 Subject: [PATCH] reset core data database without crashing --- Meshtastic/Helpers/BLEManager.swift | 31 ++----------------- Meshtastic/Helpers/UpdateCoreData.swift | 20 ++++++++++++ .../Views/Settings/Config/DeviceConfig.swift | 16 +++++----- 3 files changed, 31 insertions(+), 36 deletions(-) diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 92bdc327..815b5502 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -1140,22 +1140,9 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph if connectedPeripheral!.peripheral.state == CBPeripheralState.connected { - do { - - try context!.save() - - if meshLoggingEnabled { MeshLogger.log("💾 Saved a Factory Reset Admin Message for node: \(String(destNum))") } - + if meshLoggingEnabled { MeshLogger.log("💾 Sent a Factory Reset for node: \(String(destNum))") } connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse) return true - - } catch { - - context!.rollback() - - let nsError = error as NSError - print("💥 Error Inserting New Core Data MessageEntity: \(nsError)") - } } return false @@ -1188,23 +1175,11 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph if connectedPeripheral!.peripheral.state == CBPeripheralState.connected { do { - - try context!.save() - - if meshLoggingEnabled { MeshLogger.log("💾 Sent a NodeDB Reset Admin Message for node: \(String(destNum))") } - + if meshLoggingEnabled { MeshLogger.log("💾 Sent a NodeDB Reset for node: \(String(destNum))") } connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse) - - PersistenceController.shared.clearDatabase() - return true - } catch { - - context!.rollback() - - let nsError = error as NSError - print("💥 Error Inserting New Core Data MessageEntity: \(nsError)") + print("💥 Error Sending NodeDB Reset") } } diff --git a/Meshtastic/Helpers/UpdateCoreData.swift b/Meshtastic/Helpers/UpdateCoreData.swift index 1f6aa670..5a5d71e3 100644 --- a/Meshtastic/Helpers/UpdateCoreData.swift +++ b/Meshtastic/Helpers/UpdateCoreData.swift @@ -59,3 +59,23 @@ public func clearTelemetry(destNum: Int64, metricsType: Int32, context: NSManage return false } } + +public func clearCoreDataDatabase(context: NSManagedObjectContext) { + + let persistenceController = PersistenceController.shared.container + + for i in 0...persistenceController.managedObjectModel.entities.count-1 { + let entity = persistenceController.managedObjectModel.entities[i] + + do { + let query = NSFetchRequest(entityName: entity.name!) + let deleterequest = NSBatchDeleteRequest(fetchRequest: query) + try context.execute(deleterequest) + try context.save() + + } catch let error as NSError { + print("Error: \(error.localizedDescription)") + abort() + } + } +} diff --git a/Meshtastic/Views/Settings/Config/DeviceConfig.swift b/Meshtastic/Views/Settings/Config/DeviceConfig.swift index 84c193de..3f568195 100644 --- a/Meshtastic/Views/Settings/Config/DeviceConfig.swift +++ b/Meshtastic/Views/Settings/Config/DeviceConfig.swift @@ -13,6 +13,7 @@ struct DeviceConfig: View { var node: NodeInfoEntity? + @State private var isPresentingNodeDBResetConfirm = false @State private var isPresentingFactoryResetConfirm = false @State private var isPresentingSaveConfirm = false @State var initialLoad: Bool = true @@ -61,8 +62,7 @@ struct DeviceConfig: View { HStack { Button("Reset NodeDB", role: .destructive) { - - isPresentingFactoryResetConfirm = true + isPresentingNodeDBResetConfirm = true } .disabled(bleManager.connectedPeripheral == nil) .buttonStyle(.bordered) @@ -71,19 +71,20 @@ struct DeviceConfig: View { .padding() .confirmationDialog( "Are you sure?", - isPresented: $isPresentingFactoryResetConfirm, + isPresented: $isPresentingNodeDBResetConfirm, titleVisibility: .visible ) { Button("Erase the NodeDB from node and app?", role: .destructive) { - if !bleManager.sendNodeDBReset(destNum: bleManager.connectedPeripheral.num) { - print("NodeDB Reset Failed") + } else { + // Disconnect from device as we are going to wipe the app database now + bleManager.disconnectPeripheral() + clearCoreDataDatabase(context: context) } } } Button("Factory Reset", role: .destructive) { - isPresentingFactoryResetConfirm = true } .disabled(bleManager.connectedPeripheral == nil) @@ -102,8 +103,7 @@ struct DeviceConfig: View { print("Factory Reset Failed") } else { - - // Disconnect from device as we are going to wipe the app database too + // Disconnect from device as we are going to wipe the app database now bleManager.disconnectPeripheral() } }