【问题标题】:I was initially using Environment objects in my app to manage state in my application, but now need coreData. Should i drop the environment object?我最初在我的应用程序中使用环境对象来管理我的应用程序中的状态,但现在需要 coreData。我应该删除环境对象吗?
【发布时间】:2021-04-01 09:49:42
【问题描述】:

我很困惑如何将 CoreData 与我的应用程序集成。我使用环境对象作为我的模型来管理状态,但是这不会长期保持状态,并且需要在应用程序关闭时保存信息。因此我被告知要使用 CoreData,但我现在已经设置了我的第一个实体,但不知道如何将它集成到我的应用程序中。

有什么方法可以将环境对象设置为我的 CoreData 的实体,并在应用程序关闭后更新 coreData 等。

为了给出一些上下文,我有环境对象,当用户输入一些信息时会发生变化,并使用该环境对象将数据存储在我的 CoreData 中。然后如何更改每个视图上的环境对象以匹配我的 CoreData (是否在某些初始化程序中?)

谢谢

【问题讨论】:

    标签: swift core-data swiftui


    【解决方案1】:

    查看斯坦福 iOS 课程episode 12

    如何将 CoreData 添加到现有应用的一个很好的示例。

    使用@FetchedResults 属性包装器让您的视图使用CoreData 数据库的内容进行更新。 (hackingwithswift example)

    注意:在您的视图中使用@StateObject 属性包装器而不是@ObservableObject。斯坦福讲师使用的是旧版本的 SwiftUI。现在推荐的实现是使用@StateObject。

    【讨论】:

      【解决方案2】:

      我猜在这种情况下你不需要环境对象,因为 CoreData 信息可以直接使用,它也会更新你的视图。

      首先需要在Environment中添加CoreData的persistenceControler:

      @main
      struct YourApp: App {
          let persistenceController = PersistenceController.shared
          
          @StateObject var otherEnvironmentStuff: OtherEnvironmentStuff = OtherEnvironmentStuff()
          
          var body: some Scene {
              WindowGroup {
                  ContentView()
                      .environment(\.managedObjectContext, persistenceController.container.viewContext)
                      .environmentObject(otherEnvironmentStuff)
              }
          }
      }
      

      然后你可以直接在所有视图中使用CoreData,并添加数据,将直接在视图中使用:

      struct MyView: View {
          @Environment(\.managedObjectContext) private var viewContext
          
          @FetchRequest(
              entity: EntityClassName.entity(),
              sortDescriptors: [NSSortDescriptor(keyPath: \EntityClassName.name, ascending: false)],
              predicate: NSPredicate(format: "someAttributeName == %@", NSNumber(value: false)),
              animation: .default)
          private var myEntities: FetchedResults<EntityClassName>
          
          var body: some View {
              Text("Do Whatever you want with the CoreData data...")
          }
      
          func addValue() {
              let newEntity: EntityClassName = EntityClassName(context: viewContext)
              newEntity.someAttributeName = someValueToSet
              do {
                  try viewContext.save()
              } catch {
                  print(error.localizedDescription)
              }
          }
      }
      

      如果您不需要谓词或排序描述符,只需删除它们即可。

      如果您没有 PersistanceController,只需使用 CoreData 为 SwiftUI 创建一个新的 Xcode Porject,Xcode 将为您创建一个,您可以将其复制到您当前的项目中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 2018-08-11
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        相关资源
        最近更新 更多