【问题标题】:CoreData and SwiftUICoreData 和 SwiftUI
【发布时间】:2020-10-19 03:47:34
【问题描述】:

您好,我正在尝试为我的项目实现 Core Data 和 swiftUI。

我创建了一个名为 Aeroporti 的实体,它包含 2 个属性 iataAPT : String 和 icaoAPT: string。

我想保存简单的数据。

我这样设置应用委托:

  // MARK: - Core Data stack

    lazy var persistentContainer: NSPersistentContainer = {
        
        let container = NSPersistentContainer(name: "testFirebaseCoreData")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    // MARK: - Core Data Saving support

    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }

我的内容视图列出实体 Aeroporti 中的字段 icaoAPT

import SwiftUI
import CoreData

struct ContentView: View {
    @ObservedObject var dm : DataManager
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(entity: Aeroporti.entity(),
                  sortDescriptors: [NSSortDescriptor(keyPath: \Aeroporti.icaoAPT, ascending: true)]) var aeroport : FetchedResults<Aeroporti> // crea la variabile che contiene le ricette
   
    var body: some View {
        List{
            HStack{
                
               // NOT WORKING IF USING DataMANAGER
//                Button(action: {
//                    self.dm.provaSalva()
//                }) {
//                    Text("save from manager")
//                }
                
                saveFromView    // button save from view
            }
            ForEach(aeroport, id: \.self) { apt in
                Text(apt.icaoAPT ?? "sconosciuto")
//                    .environment(\.managedObjectContext, self.managedObjectContext)
            }
        }
        
    }
    
    var saveFromView : some View {
        
        Button(action: {
            let apt = Aeroporti(context: self.managedObjectContext)
            apt.iataAPT = "MFM"
            apt.icaoAPT = "VMMC"
            
            do {
                try self.managedObjectContext.save()
                print("airport saved.")
                
            } catch {
                print(error.localizedDescription)
            }
        }) {
            
            Text("save fromview")
        }
        
    }
}

如果我使用 ContentView 中的按钮 (saveFromView),一切正常,数据将被保存。

现在,为了更好地处理数据,我创建了一个 DataManager,我在其中放置了相同的代码以将数据保存在实体中,并尝试通过按钮在内容视图上午餐此代码(从管理器中保存)但它不起作用,我在保存时收到错误“操作无法完成。(Foundation._GenericObjCError 错误 0。)”。

import Combine
import SwiftUI
import CoreData


class DataManager:  ObservableObject {
    
    let objectWillChange = PassthroughSubject<Void, Never>()
    @Environment(\.managedObjectContext) var managedObjectContext
    
    
    func provaSalva() {
        let apt = Aeroporti(context: managedObjectContext)
        apt.iataAPT = "MFM"
        apt.icaoAPT = "VMMC"
        
        do {
            try self.managedObjectContext.save()
            print("airport saved.")
            
        } catch {
            print(error.localizedDescription)
        }
    }
    
    
}

问题是??为什么..是相同的代码...如果我想处理不在 ContentView 中的保存数据,我该如何解决这个问题。

感谢您的帮助..

【问题讨论】:

    标签: swift xcode core-data save swiftui


    【解决方案1】:

    试试这个。这是我用于我的应用的实现。

    class DataManager {
        //MARK: - Setup
            
        //Singleton object
        static let defaults = DataManager()
        private init() {}
        
        //Managed object context
        var moc: NSManagedObjectContext {
            return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        }
        
        //Save context, if changes were made
        func save() {
            if moc.hasChanges {
                do {
                    print("Sucess!!")
                    try moc.save()
                } catch {
                    print("Error while saving managedObjectContext \(error)")
                }
            }
        }
    
        //MARK: - Insert
    
        //What you want to save
        func provaSalva() {
            let apt = Aeroporti(context: moc)
            apt.iataAPT = "MFM"
            apt.icaoAPT = "VMMC"
            
            save()
        }
    }
    

    你的saveFromView

    var saveFromView : some View {
        Button(action: {
            DataManager.defaults.provaSalva()
        }) {
            Text("save fromview")
        }
    }
    

    【讨论】:

      【解决方案2】:

      通过将数据库传递给函数来解决

       func provaSalva(dbCore: NSManagedObjectContext) {
              let apt = Aeroporti(context: dbCore)
              apt.iataAPT = "MFM"
              apt.icaoAPT = "VMMC"
              
              do {
                  try dbCore.save()
                  print("airport saved.")
                  
              } catch {
                  print(error.localizedDescription)
              }
          }
      
      

      【讨论】:

        猜你喜欢
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 2020-04-18
        • 2023-03-30
        • 1970-01-01
        • 2020-05-05
        • 2020-11-12
        相关资源
        最近更新 更多