如何在初始化时初始化 CoreData 中的值,然后使它们可以在整个应用程序中访问

问题描述 投票:0回答:1

当我的应用程序打开时,我在初始化 CoreData 实体的值时遇到了挑战。我想在持久化容器初始化后设置它们。我看到了使用 MVVM 的这个视频,我没有使用它,但展示了如何在 CoreData 初始化后立即运行获取。我为了举例而对其进行了调整:

class CoreDataViewModel: ObservableObject {

    let container = NSPersistentContainer
    @Published var defaultEntity?: FruitEntity = nil

    init() {
        container = NSPersistentContainer(name: "FruitsContainer")

        container.loadPersistentStores { description, error in
            if let error = error {
                fatalError("Error: \(error.localizedDescription)")
            } else {
                print("successfully loaded PersistentStores")
            }
        }
    setDefaultCase()

    }

    func fetchFruits() {
        let request = NSFetchRequest<FruitEntity>(entityName: "FruitEntity")
    
         do {
            defaultEntity = try container.viewContext.fetch(request).first
        
        } catch let error {
            print("ERROR fetching: \(error)")
            defaultEntity = nil
        }
    }

}

问题是我正在使用此视频中的代码将 ManagedObjectContext 设置为 EnvrionmentObject,这样我就可以在我可能需要它的任何视图中使用它:

    WindowGroup {
        ContentView()
            .environment(\.managedObjectContext, persistenceController.container.viewContext)
    }

此示例中的 savingEntities 对象将是我想要在应用程序中的任何位置访问的对象,但我还需要通过简单地调用以下方式在任何需要的地方使用 ManagedObjectContext:

@Environment(\.managedObjectContext) var moc

并使用默认实体,例如:

if defaultEntity != nil {
    FirstView()
} else {
    SecondView()
}

代表在这里有意义吗?如果我需要在数据库初始化后的某个时刻创建第二个对象,委托也会帮忙吗?

swift core-data
1个回答
0
投票

您的 CoreDataViewModel 符合 ObservableObject,因此您可以将其用作环境对象并可以在所有视图中访问它。

@StateObject var coreDataViewModel = CoreDataViewModel()

WindowGroup {
    ContentView()
        .environment(\.managedObjectContext, persistenceController.container.viewContext)
        .environmentObject(coreDataViewModel)
}
© www.soinside.com 2019 - 2024. All rights reserved.