Hallo zusammen,
ich verwalte in meiner App eine Datenbank. Ich möchte der App gerne die Funktion zum Sport und Export der Datenbank hinzufügen. Der Export funktioniert soweit erstmal, es wird eine *.sqlite Datei erstellt. Nun habe ich beim Import das Problem, dass ich die Datei zwar im Fester sehe, ich kann jedoch keine Datei auswählen. Woran hängt? Muss ich der App den Zugriff noch extra in der Info erlauben? Ist mein Code unvollständig?
Anbei der Code, wie ich die Funktion aktuell implementiert habe
Alles anzeigen
Und der Aufruf
Alles anzeigen
ich verwalte in meiner App eine Datenbank. Ich möchte der App gerne die Funktion zum Sport und Export der Datenbank hinzufügen. Der Export funktioniert soweit erstmal, es wird eine *.sqlite Datei erstellt. Nun habe ich beim Import das Problem, dass ich die Datei zwar im Fester sehe, ich kann jedoch keine Datei auswählen. Woran hängt? Muss ich der App den Zugriff noch extra in der Info erlauben? Ist mein Code unvollständig?
Anbei der Code, wie ich die Funktion aktuell implementiert habe
Quellcode
- // export funktion
- func exportDatabase(completion: @escaping (URL?) -> Void) {
- let context = persistentContainer.viewContext
- let storeCoordinator = persistentContainer.persistentStoreCoordinator
- guard let store = storeCoordinator.persistentStores.first else {
- completion(nil)
- return
- }
- let exportURL = FileManager.default.temporaryDirectory.appendingPathComponent("BookCatalog.sqlite")
- do {
- try storeCoordinator.migratePersistentStore(store, to: exportURL, options: nil, withType: NSSQLiteStoreType)
- completion(exportURL)
- } catch {
- print("Failed to export database: \(error)")
- completion(nil)
- }
- }
- // import funktion
- func importDatabase(from url: URL, completion: @escaping (Bool) -> Void) {
- let storeCoordinator = persistentContainer.persistentStoreCoordinator
- guard let store = storeCoordinator.persistentStores.first else {
- completion(false)
- return
- }
- do {
- try storeCoordinator.destroyPersistentStore(at: store.url!, ofType: NSSQLiteStoreType, options: nil)
- try storeCoordinator.replacePersistentStore(at: store.url!, destinationOptions: nil, withPersistentStoreFrom: url, sourceOptions: nil, ofType: NSSQLiteStoreType)
- try persistentContainer.viewContext.save()
- completion(true)
- } catch {
- print("Failed to import database: \(error)")
- completion(false)
- }
- }
Und der Aufruf
Quellcode
- // Export and Import Section
- DisclosureGroup {
- VStack {
- Button("Export Database") {
- databaseManager.exportDatabase { url in
- if let url = url {
- documentURL = url
- showDocumentExporter = true
- }
- }
- }
- .padding()
- .background(Color.blue)
- .foregroundColor(.white)
- .cornerRadius(8)
- .fileExporter(isPresented: $showDocumentExporter, document: documentURL.map { DatabaseDocument(url: $0) }, contentType: .database, defaultFilename: "BookCatalog") { result in
- switch result {
- case .success:
- print("Export successful")
- case .failure(let error):
- print("Export failed: \(error)")
- }
- }
- Button("Import Database") {
- showDocumentImporter = true
- }
- .padding()
- .background(Color.green)
- .foregroundColor(.white)
- .cornerRadius(8)
- .fileImporter(isPresented: $showDocumentImporter, allowedContentTypes: [.database], allowsMultipleSelection: false) { result in
- switch result {
- case .success(let urls):
- if let url = urls.first {
- databaseManager.importDatabase(from: url) { success in
- if success {
- showAlert = true
- } else {
- print("Import failed")
- }
- }
- }
- case .failure(let error):
- print("Import failed: \(error)")
- }
- }
- }
- }
- label: {
- Text("Export/Import Database")
- .foregroundColor(.blue)
- }
- }
- .padding()