From 4126b0180fe537580bbd4cf5400addca4bc244d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dr=2E=20Julian-Steffen=20M=C3=BCller?= Date: Thu, 27 May 2021 21:05:45 +0200 Subject: [PATCH] Reset library now working --- Zockerhoehle/AppDelegate.swift | 2 +- Zockerhoehle/CDModel/Game+CoreDataClass.swift | 13 +--- Zockerhoehle/Utils/LibraryImport.swift | 39 ++++++----- Zockerhoehle/Views/SettingsView.swift | 68 ++++++++++++------- 4 files changed, 68 insertions(+), 54 deletions(-) diff --git a/Zockerhoehle/AppDelegate.swift b/Zockerhoehle/AppDelegate.swift index 7877aa6..415d3e4 100644 --- a/Zockerhoehle/AppDelegate.swift +++ b/Zockerhoehle/AppDelegate.swift @@ -24,7 +24,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { print("disFinishLaunchung") - ICloudManager.shared.preload_all_data() + //ICloudManager.shared.preload_all_data() return true } diff --git a/Zockerhoehle/CDModel/Game+CoreDataClass.swift b/Zockerhoehle/CDModel/Game+CoreDataClass.swift index 5fb9454..93e7761 100644 --- a/Zockerhoehle/CDModel/Game+CoreDataClass.swift +++ b/Zockerhoehle/CDModel/Game+CoreDataClass.swift @@ -13,18 +13,7 @@ import SwiftUI @objc(Game) 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 { return gameA.createdAt < gameB.createdAt } diff --git a/Zockerhoehle/Utils/LibraryImport.swift b/Zockerhoehle/Utils/LibraryImport.swift index 4ea08b3..c4a6995 100644 --- a/Zockerhoehle/Utils/LibraryImport.swift +++ b/Zockerhoehle/Utils/LibraryImport.swift @@ -29,6 +29,7 @@ class LibraryImport { return .none } } + func backupFiles() -> [String] { do { guard let documentDirectory = try ICloudManager.backup_folder else { return [] } @@ -53,24 +54,27 @@ class LibraryImport { return [] } - private func resetDatabase() { - self.CDContext.reset() + func resetDatabase(games : [Game], accessories : [Accessory], consoles : [Console], gameSeries: [GameSeries]) { self.CDContext.performAndWait { - let deleteRequests = - [NSBatchDeleteRequest(fetchRequest: Game.fetchRequest()), - NSBatchDeleteRequest(fetchRequest: Accessory.fetchRequest()), - NSBatchDeleteRequest(fetchRequest: Console.fetchRequest()), - NSBatchDeleteRequest(fetchRequest: GameSeries.fetchRequest())] - - let storeCoordinator = CDManager.shared.persistentContainer.persistentStoreCoordinator - do { - for deleteRequest in deleteRequests { - try storeCoordinator.execute(deleteRequest, with: CDContext) +// let gamesFR = NSFetchRequest(entityName: "Game") +// let accessoriesFR = NSFetchRequest(entityName: "Accessory") +// let consoleFR = NSFetchRequest(entityName: "Console") +// let gameSeriesFR = NSFetchRequest(entityName: "GameSeries") +// +// 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) + + for cdObject in core_data_objects { + CDManager.shared.viewContext.delete(cdObject) } - }catch let error { - print(error) - print("LibraryImport::resetDatabase - Reset of Database failes!") - } } } @@ -158,7 +162,6 @@ class LibraryImport { func importLIB(data : Data) { do { let library = try JSONDecoder().decode(BHLibrary.self, from: data) - resetDatabase() var gameDict = [UUID:Game]() var accessoryDict = [UUID:Accessory]() @@ -191,6 +194,8 @@ class LibraryImport { }catch let error { print("LibraryImport::importLIB::DATA - Error while importing! '\(error)'") } + + print("Import Successfull") } } diff --git a/Zockerhoehle/Views/SettingsView.swift b/Zockerhoehle/Views/SettingsView.swift index f782db8..317505f 100644 --- a/Zockerhoehle/Views/SettingsView.swift +++ b/Zockerhoehle/Views/SettingsView.swift @@ -19,45 +19,65 @@ struct SettingsView: View { @State var backupImportUpdateExistingEntrys = false @State var importFiles : [String] = LibraryImport().backupFiles() + @FetchRequest(entity: Game.entity(), sortDescriptors: []) + var games: FetchedResults + + @FetchRequest(entity: Accessory.entity(), sortDescriptors: []) + var accessories: FetchedResults + + @FetchRequest(entity: Console.entity(), sortDescriptors: []) + var consoles: FetchedResults + + @FetchRequest(entity: GameSeries.entity(), sortDescriptors: []) + var gameSeries: FetchedResults + func exportLibrary() { - do { - let gamesFR = NSFetchRequest(entityName: "Game") - let consolesFR = NSFetchRequest(entityName: "Console") - let gameSeriesFR = NSFetchRequest(entityName: "GameSeries") - let accessoriesFR = NSFetchRequest(entityName: "Accessory") - - let games = try CDManager.shared.viewContext.fetch(gamesFR) - 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()) - importFiles = LibraryImport().backupFiles() - }catch { - print("ERROR during export") - } + // There is currently no way to directly convert FetchesResults to array. + // Maybe I should do an Fetchesresulsts Extension + var exportGames : [Game] = [] + games.forEach {exportGames.append($0)} + 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 libExport = LibraryExporter(games: exportGames, consoles: exportConsoles, gameSeries: exportGameSeries, accessories: exportAccessories) + + libExport.export(name: Date().formattedInTimeZone()) + importFiles = LibraryImport().backupFiles() } + 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 { Form { - Section(header: Text("Backup Library")) { - Button(action: { self.exportLibrary() }, label: { Text("Do Backup") }) - } - - Section(header: Text("Restore Library")) { + Section(header: Text("Backup")) { + Button(action: { self.exportLibrary() }, label: { Text("Bärenhöhle sichern!") }) + Picker(selection: $backupImportFileIndex, label: Text("Choose Backup")) { Text("None").tag(-1) ForEach(0 ..< (importFiles.count), id: \.self) { Text(LibraryImport.backupName(from: self.importFiles[$0]) ?? "n/a").tag($0) }.navigationBarTitle("Backups") } - Toggle("Yes, I want to reset my Database", isOn: $backupImportUpdateExistingEntrys) + Toggle("Ja, Ich will alles zurücksetzen", isOn: $backupImportUpdateExistingEntrys) Button(action: { + deleteLibrary() LibraryImport().importLIB(from: self.importFiles[self.backupImportFileIndex]) }, label: { Text("Reset & Import") }).disabled(backupImportFileIndex < 0 || !backupImportUpdateExistingEntrys) + Button(action: { + deleteLibrary() + }, label: { Text("Nur Reset") }).disabled(!backupImportUpdateExistingEntrys) } }.navigationBarTitle("Einstellungen") + } }