Reset library now working

This commit is contained in:
2021-05-27 21:05:45 +02:00
parent dc4f8b0ebe
commit 4126b0180f
4 changed files with 68 additions and 54 deletions

View File

@@ -24,7 +24,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
print("disFinishLaunchung") print("disFinishLaunchung")
ICloudManager.shared.preload_all_data() //ICloudManager.shared.preload_all_data()
return true return true
} }

View File

@@ -13,17 +13,6 @@ import SwiftUI
@objc(Game) @objc(Game)
public class Game: NSManagedObject, Identifiable { public class Game: NSManagedObject, Identifiable {
// public func addGameSeries(by objectIDStringified : String) {
// if let url = URL(string: objectIDStringified) {
// let persistentStoreCoordinator = CDManager.shared.persistentContainer.persistentStoreCoordinator
//
// if let objectID = persistentStoreCoordinator.managedObjectID(forURIRepresentation: url) {
// if let gameSeries = CDManager.shared.viewContext.object(with: objectID) as? GameSeries {
// self.series = gameSeries
// }
// }
// }
// }
public static func compareByCreationDate(gameA : Game, gameB : Game) -> Bool { public static func compareByCreationDate(gameA : Game, gameB : Game) -> Bool {
return gameA.createdAt < gameB.createdAt return gameA.createdAt < gameB.createdAt

View File

@@ -29,6 +29,7 @@ class LibraryImport {
return .none return .none
} }
} }
func backupFiles() -> [String] { func backupFiles() -> [String] {
do { do {
guard let documentDirectory = try ICloudManager.backup_folder else { return [] } guard let documentDirectory = try ICloudManager.backup_folder else { return [] }
@@ -53,23 +54,26 @@ class LibraryImport {
return [] return []
} }
private func resetDatabase() { func resetDatabase(games : [Game], accessories : [Accessory], consoles : [Console], gameSeries: [GameSeries]) {
self.CDContext.reset()
self.CDContext.performAndWait { self.CDContext.performAndWait {
let deleteRequests = // let gamesFR = NSFetchRequest<Game>(entityName: "Game")
[NSBatchDeleteRequest(fetchRequest: Game.fetchRequest()), // let accessoriesFR = NSFetchRequest<Accessory>(entityName: "Accessory")
NSBatchDeleteRequest(fetchRequest: Accessory.fetchRequest()), // let consoleFR = NSFetchRequest<Console>(entityName: "Console")
NSBatchDeleteRequest(fetchRequest: Console.fetchRequest()), // let gameSeriesFR = NSFetchRequest<GameSeries>(entityName: "GameSeries")
NSBatchDeleteRequest(fetchRequest: GameSeries.fetchRequest())] //
// let games = try CDManager.shared.viewContext.fetch(gamesFR) as [NSManagedObject]
// let accessories = try CDManager.shared.viewContext.fetch(accessoriesFR) as [NSManagedObject]
// let consoles = try CDManager.shared.viewContext.fetch(consoleFR) as [NSManagedObject]
// let gameSeries = try CDManager.shared.viewContext.fetch(gameSeriesFR) as [NSManagedObject]
//
var core_data_objects : [NSManagedObject] = []
core_data_objects.append(contentsOf: games)
core_data_objects.append(contentsOf: accessories)
core_data_objects.append(contentsOf: consoles)
core_data_objects.append(contentsOf: gameSeries)
let storeCoordinator = CDManager.shared.persistentContainer.persistentStoreCoordinator for cdObject in core_data_objects {
do { CDManager.shared.viewContext.delete(cdObject)
for deleteRequest in deleteRequests {
try storeCoordinator.execute(deleteRequest, with: CDContext)
}
}catch let error {
print(error)
print("LibraryImport::resetDatabase - Reset of Database failes!")
} }
} }
} }
@@ -158,7 +162,6 @@ class LibraryImport {
func importLIB(data : Data) { func importLIB(data : Data) {
do { do {
let library = try JSONDecoder().decode(BHLibrary.self, from: data) let library = try JSONDecoder().decode(BHLibrary.self, from: data)
resetDatabase()
var gameDict = [UUID:Game]() var gameDict = [UUID:Game]()
var accessoryDict = [UUID:Accessory]() var accessoryDict = [UUID:Accessory]()
@@ -191,6 +194,8 @@ class LibraryImport {
}catch let error { }catch let error {
print("LibraryImport::importLIB::DATA - Error while importing! '\(error)'") print("LibraryImport::importLIB::DATA - Error while importing! '\(error)'")
} }
print("Import Successfull")
} }
} }

View File

@@ -19,45 +19,65 @@ struct SettingsView: View {
@State var backupImportUpdateExistingEntrys = false @State var backupImportUpdateExistingEntrys = false
@State var importFiles : [String] = LibraryImport().backupFiles() @State var importFiles : [String] = LibraryImport().backupFiles()
@FetchRequest(entity: Game.entity(), sortDescriptors: [])
var games: FetchedResults<Game>
@FetchRequest(entity: Accessory.entity(), sortDescriptors: [])
var accessories: FetchedResults<Accessory>
@FetchRequest(entity: Console.entity(), sortDescriptors: [])
var consoles: FetchedResults<Console>
@FetchRequest(entity: GameSeries.entity(), sortDescriptors: [])
var gameSeries: FetchedResults<GameSeries>
func exportLibrary() { func exportLibrary() {
do { // There is currently no way to directly convert FetchesResults to array.
let gamesFR = NSFetchRequest<Game>(entityName: "Game") // Maybe I should do an Fetchesresulsts Extension
let consolesFR = NSFetchRequest<Console>(entityName: "Console") var exportGames : [Game] = []
let gameSeriesFR = NSFetchRequest<GameSeries>(entityName: "GameSeries") games.forEach {exportGames.append($0)}
let accessoriesFR = NSFetchRequest<Accessory>(entityName: "Accessory") var exportAccessories : [Accessory] = []
accessories.forEach {exportAccessories.append($0)}
var exportConsoles : [Console] = []
consoles.forEach {exportConsoles.append($0)}
var exportGameSeries : [GameSeries] = []
gameSeries.forEach {exportGameSeries.append($0)}
let games = try CDManager.shared.viewContext.fetch(gamesFR) let libExport = LibraryExporter(games: exportGames, consoles: exportConsoles, gameSeries: exportGameSeries, accessories: exportAccessories)
let consoles = try CDManager.shared.viewContext.fetch(consolesFR)
let gameSeries = try CDManager.shared.viewContext.fetch(gameSeriesFR)
let accessories = try CDManager.shared.viewContext.fetch(accessoriesFR)
let libExport = LibraryExporter(games: games, consoles: consoles, gameSeries: gameSeries, accessories: accessories)
libExport.export(name: Date().formattedInTimeZone()) libExport.export(name: Date().formattedInTimeZone())
importFiles = LibraryImport().backupFiles() importFiles = LibraryImport().backupFiles()
}catch {
print("ERROR during export")
}
} }
fileprivate func deleteLibrary() {
games.forEach{CDManager.shared.viewContext.delete($0)}
accessories.forEach{CDManager.shared.viewContext.delete($0)}
consoles.forEach{CDManager.shared.viewContext.delete($0)}
gameSeries.forEach{CDManager.shared.viewContext.delete($0)}
}
@State var showDeletionAlert : Bool = false
var body: some View { var body: some View {
Form { Form {
Section(header: Text("Backup Library")) { Section(header: Text("Backup")) {
Button(action: { self.exportLibrary() }, label: { Text("Do Backup") }) Button(action: { self.exportLibrary() }, label: { Text("Bärenhöhle sichern!") })
}
Section(header: Text("Restore Library")) {
Picker(selection: $backupImportFileIndex, label: Text("Choose Backup")) { Picker(selection: $backupImportFileIndex, label: Text("Choose Backup")) {
Text("None").tag(-1) Text("None").tag(-1)
ForEach(0 ..< (importFiles.count), id: \.self) { ForEach(0 ..< (importFiles.count), id: \.self) {
Text(LibraryImport.backupName(from: self.importFiles[$0]) ?? "n/a").tag($0) Text(LibraryImport.backupName(from: self.importFiles[$0]) ?? "n/a").tag($0)
}.navigationBarTitle("Backups") }.navigationBarTitle("Backups")
} }
Toggle("Yes, I want to reset my Database", isOn: $backupImportUpdateExistingEntrys) Toggle("Ja, Ich will alles zurücksetzen", isOn: $backupImportUpdateExistingEntrys)
Button(action: { Button(action: {
deleteLibrary()
LibraryImport().importLIB(from: self.importFiles[self.backupImportFileIndex]) LibraryImport().importLIB(from: self.importFiles[self.backupImportFileIndex])
}, label: { Text("Reset & Import") }).disabled(backupImportFileIndex < 0 || !backupImportUpdateExistingEntrys) }, label: { Text("Reset & Import") }).disabled(backupImportFileIndex < 0 || !backupImportUpdateExistingEntrys)
Button(action: {
deleteLibrary()
}, label: { Text("Nur Reset") }).disabled(!backupImportUpdateExistingEntrys)
} }
}.navigationBarTitle("Einstellungen") }.navigationBarTitle("Einstellungen")
} }
} }