使用 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 Data
和SwiftUI
的问题。
我的主视图可以访问来自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”