mirror of
https://github.com/meshtastic/Meshtastic-Apple.git
synced 2026-04-20 22:13:56 +00:00
reset core data database without crashing
This commit is contained in:
parent
6134a6196a
commit
0814f73069
3 changed files with 31 additions and 36 deletions
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue