CoreData - Problem beim persistenten Speichern der Daten

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2021 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

    • CoreData - Problem beim persistenten Speichern der Daten

      Hallo,

      ich arbeite gerade an meiner ersten eigenen App in SwiftUI. Bis jetzt lief alles super, auch die Arbeit mit CoreData in diversen Views funktioniert.

      Nun habe ich versucht in meiner MainView (ContentView) beim erstmaligen öffnen der App, Grunddaten in den Store zu schreiben, welche ich später in der App verwenden kann. Ich kontrolliere ob die App zum ersten mal gestartet wird in dem ich mit einem FetchRequest prüfe ob die Entity "Uebungen" bereits Instanzen besitzt. Wenn nicht, sollen mittels eines Array Instanzen im Context erstellt und durch diesen gespeichert werden. Leider kriege ich beim context.save() einen fatalError:

      Fatal error: Unresolved error Foundation._GenericObjCError.nilError

      Die context.save() Methode läuft in der restlichen App problemlos durch und ich habe diese eigentlich nur kopiert und für die entsprechende Übung angepasst. Vielleicht kann mir einer helfen, wie ich diesen Error loskriege, da ich aktuell total auf dem Schlauch stehe und ohne die Übungen nicht weiter programmieren kann, da ich diese in einer List benötige.

      Quellcode

      1. import SwiftUI
      2. import CoreData
      3. struct ContentView: View {
      4. @Environment(\.managedObjectContext) private var viewContext
      5. @FetchRequest var initTest: FetchedResults<Uebung>
      6. // VIEW INITIALISIERUNG
      7. init() {
      8. // ERSTES ÖFFNEN
      9. self._initTest = FetchRequest(
      10. entity: Uebung.entity(),
      11. sortDescriptors: [])
      12. if(self.initTest.count == 0) {
      13. let uebungen: [[String]] = [
      14. ["Übung 1", "Beschreibung 1", "Art 1"],
      15. ["Übung 2", "Beschreibung 2", "Art 2"],
      16. ["Übung 3", "Beschreibung 3", "Art 3"]
      17. ]
      18. for uebung in uebungen {
      19. let neueUebung = Uebung(context: viewContext)
      20. neueUebung.name = uebung[0]
      21. neueUebung.beschreibung = uebung[1]
      22. neueUebung.art = uebung[2]
      23. do {
      24. try viewContext.save()
      25. } catch {
      26. let nsError = error as NSError
      27. fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
      28. }
      29. }
      30. }
      Alles anzeigen
      Danke schon mal im Voraus! :thumbup:


      Gruß

      René
    • Moin, Moin,

      setze doch dein Initalcode in die @main. Da kannst alle initialeinstellungen problemlos setzen. Eine Vie, verträgt so gut sie keine Logik

      PS: Ausserdem fehlt dir da die View

      pps: falls du die @main nicht kennst, hier die Suchhilfe

      Quellcode

      1. @main
      2. struct MyApp: App {
      3. // hier wird initialisiert
      4. var body: some Scene {
      5. WindowGroup {
      6. ContentView()
      7. }
      8. }
      9. }

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Wolf ()

    • Hallo Wolf,

      danke für die schnelle Antwort. Du hast mich auf den richtigen Weg geführt. Da ich die Daten für die Übungen nun aus einer Datenbank im Internet lade, kam ich mit der @main nicht weiter, da ich da keine async Funktionen ausführen konnte. Stattdessen hab ich das Ganze jetzt zwar im ContentView belassen, aber nicht mehr in der Init. Die async-Task wird jetzt durch den .task -Modifier an meinem TabView gestartet und problemlos ausgeführt

      Quellcode

      1. import SwiftUI
      2. import CoreData
      3. struct Response: Codable {
      4. var results: [Result]
      5. }
      6. struct Result: Codable {
      7. var uebungsid: Int
      8. var titel: String
      9. var beschreibung: String
      10. var variante: String
      11. }
      12. struct ContentView: View {
      13. @Environment(\.managedObjectContext) private var viewContext
      14. @FetchRequest var uebungen: FetchedResults<Uebung>
      15. init() {
      16. self._uebungen = FetchRequest(
      17. entity: Uebung.entity(),
      18. sortDescriptors: [])
      19. }
      20. func loadData() async {
      21. guard let url = URL(string: "https://MEINEURL") else {
      22. print("Invalid URL")
      23. return
      24. }
      25. do {
      26. let (data, _) = try await URLSession.shared.data(from: url)
      27. if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
      28. updateUebungen(results: decodedResponse.results)
      29. }
      30. } catch {
      31. let nsError = error as NSError
      32. print(nsError)
      33. }
      34. }
      35. func updateUebungen(results: [Result]) {
      36. for uebung in uebungen {
      37. viewContext.delete(uebung)
      38. }
      39. for i in 0...results.count-1 {
      40. let neueUebung = Uebung(context: viewContext)
      41. neueUebung.titel = results[i].titel
      42. neueUebung.beschreibung = results[i].beschreibung
      43. neueUebung.variante = results[i].variante
      44. }
      45. do {
      46. try viewContext.save()
      47. } catch {
      48. let nsError = error as NSError
      49. fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
      50. }
      51. }
      52. var body: some View {
      53. TabView {
      54. // Tab Training
      55. TabTraining().task {
      56. await loadData()
      57. }
      58. // Tab Statistik
      59. TabStatistik()
      60. // Tab Einstellungen
      61. TabEinstellungen()
      62. }
      63. }
      64. }
      65. struct ContentView_Previews: PreviewProvider {
      66. static var previews: some View {
      67. ContentView()
      68. }
      69. }
      Alles anzeigen


      Gruß René