使用 Core Data 提供的数据(在 SwiftUI 中)并与另一个视图共享

Posted

技术标签:

【中文标题】使用 Core Data 提供的数据(在 SwiftUI 中)并与另一个视图共享【英文标题】:Using data provided by Core Data (in SwiftUI) and sharing with another view 【发布时间】:2020-07-22 06:56:42 【问题描述】:

这里我遇到了Core DataSwiftUI 的问题。

我的主视图可以访问来自Core Data 中的实体的一些信息。

我想将它传递给子视图,使用某种绑定,以便它也可以访问这些数据并可能更新它。

这是我尝试过的代码的一个版本。

在主视图侧:

@Environment(\.managedObjectContext) var managedObjectContext
......
@FetchRequest(
    entity: MyEntity.entity(),
    sortDescriptors: [NSSortDescriptor(keyPath: \MyEntity.name, 
                                       ascending: true)]
) var myList: FetchedResults<MyEntity>

......

var body: some View 
    VStack 
      Button(action: 
      ..........
      ).sheet(isPresented: $showingList) 
        MyListView(localList: self.$myList,
                   moc:self.managedObjectContext,
                   ......)
    
    .....

在子视图方面:

struct MyListView: View 
    @Binding var localList: FetchedResults<MyEntity>
    .....

在上面的代码中,@FetchRequest 正在工作,获取我期望的信息。但在那之后,我试图让@FetchRequest 表现得像@State。它不起作用。让我的子视图(即 MyListView)访问@FetchRequest 提供的数据的正确方法是什么?

在写这篇文章之前,我显然已经尝试了这段代码的一些其他变体,同时阅读了一些教程;但还是不行。

【问题讨论】:

我认为您可能需要重新考虑视图层次结构,理想情况下您可以将获取列表移动到MyListView 是的,理论上我确实可以。但我也尝试过这种方法,但没有成功。理想情况下,如果我知道如何做到这两点,我会很高兴。 【参考方案1】:

你不能修改FetchedResults,因为它是只读的,所以直接传递它

MyListView(localList: self.myList,
           moc:self.managedObjectContext,
           ......)

struct MyListView: View 
    var localList: FetchedResults<MyEntity>
    .....

如果您希望MyListView 的行为基于FetchRequest,则将其注入其中,与您在主视图中所做的类似,CoreData 缓存获取的实体,所以没有缺点。

.... 为此,您必须在工作表视图中显式传递上下文环境,例如 MyListView().environment(.managedObjectContext, self.managedObjectContext)

【讨论】:

是的,如果我使用您建议的代码,我确实可以访问数据。但是对于您提案的第二部分(这是我想要的),由于某种原因,我不明白 (at)FetchRequest 在放置在子视图中时不起作用。 @Michel,您必须为此在工作表视图中显式传递上下文环境,例如 MyListView().environment(\.managedObjectContext, self.managedObjectContext) 是的,你是对的,我恰好在一分钟前在这里找到了同样的答案:***.com/questions/59166513/…

以上是关于使用 Core Data 提供的数据(在 SwiftUI 中)并与另一个视图共享的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController(Core Data)不提供正确的数据源表视图控制器

在同一个数据库上同时使用 core-data 和基于 sqlite c 的 api

如何将数据提供给 iPhone 应用程序以转换为 Core Data

EF sqlite3报错 "System.Data.Entity.Core.EntityException: 在提供程序连接上启动事务时出错。有关详细信息,请参阅内部异常。

在 ASP.NET Core Web API 的已注册 .NET 数据提供程序列表中找不到指定的不变名称“System.Data.sqlClient”

如何在 Core Data 中存储星期几?