reset core data database without crashing

This commit is contained in:
Garth Vander Houwen 2022-10-03 21:19:10 -07:00
parent 6134a6196a
commit 0814f73069
3 changed files with 31 additions and 36 deletions

View file

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

View file

@ -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<NSFetchRequestResult>(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()
}
}
}

View file

@ -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()
}
}