保存数据时出现问题,将 CoreData 与 SwiftUI 一起使用

Posted

技术标签:

【中文标题】保存数据时出现问题,将 CoreData 与 SwiftUI 一起使用【英文标题】:Problem saving data, using CoreData with SwiftUI 【发布时间】:2020-07-21 06:29:55 【问题描述】:

我刚开始使用CoreDataSwiftUI。 在关注this series of tutorial 之后。 而且我面临着无法按预期保存数据的情况。以下是相关代码:

struct MyView: View 
    ......
    @Environment(\.managedObjectContext) var managedObjectContext
    
    func setData() 
        print(#function)
        .....
        let myData = SomeEntity(context: self.managedObjectContext)
        myData.name = "myName"
        myData......
        
        do 
            try self.managedObjectContext.save()
         catch let error 
            // Handle the Core Data error.
            print("Can't save as expected!!!!")
            print("Error : \(error)")
        
    
    
    .....

    var body: some View 
        ........
    

当这段代码执行时,我得到这个错误:

Can't save as expected!!!!
Error : nilError

谁能告诉我我需要检查什么?

我更感到困惑的是,我的应用程序中有另一个部分(显然相似),在上一层的视图中,保存是完美的。

如果这可能有用,视图会显示如下代码:

).sheet(isPresented: $showingFlag) 
    MyView(.....)

在呈现视图中,正在保存数据。

【问题讨论】:

检查 managedObjectContext 是否为 nil。在某些情况下,某些视图不是注入 @Environment 变量的同一视图层次结构的一部分;例如模态。 @Magnas managedObjectContext 不为零(我已经检查过了)。但我也注意到 managedObjectContext 在保存不起作用的视图和它起作用的视图中的值不同。不知道这样行不行。 是的,抱歉,刚刚检查了我自己的代码。似乎虽然它不是 nil,但该视图的环境变量并不是您期望的那样。顺便说一句,该视图是模式还是以其他方式在主层次结构之外创建?我通过将 managedObjectContext 作为普通属性传递来解决这个问题。 我刚刚更新了我的帖子,为您提供更多信息。我想这会使视图模态化。 【参考方案1】:

表格和警报等是模态视图。模态视图是普通视图,但它们不是界面视图层次结构的一部分,而是显示在屏幕上其余视图的顶部。这意味着它们无法自动访问注入到界面视图层次结构中的相同 @Environment 变量(通常在 SceneDelegate 或更新的 SwiftUI App 生命周期中)。

要访问模态视图中相同的 managedObjectContext 变量,您可以使用标准依赖注入传递它。

    ).sheet(isPresented: $showingFlag) 
    MyView(context: managedObjectContext)



struct MyView: View 
    ......
    var context: NSManagedObectContext!
    
    func setData() 
        print(#function)

【讨论】:

是的。这样可行。我想知道在哪种情况下应该直接工作而不必使用这个工作。我想当不使用 .sheet 或 .alert 时?除了非模态视图之外,ios 中似乎很少见。我错了吗? 是的,我也是这么看的。 @Environment 变量对于一个视图到另一个视图的一般流程似乎很好(有点像通过应用程序的旧 viewController 流程​​),但是当临时发生某些事情时,比如显示模式,该连接不存在。也许随着 SwiftUI 的发展,情况会发生变化,但我不太确定。

以上是关于保存数据时出现问题,将 CoreData 与 SwiftUI 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

将可转换的 NSAttributedString 保存到 Core Data 时出现异常奇怪的崩溃

将 json 文件读入 CoreData 时出现精度错误

保存一对多实体时出现神奇记录异常

iOS:更新数据时出现CoreData异常

从 CoreData 获取数据时出现“'[AnyObject]' 不可转换为 '[Dog]?'”错误

添加到 coredata 数组时出现类型不匹配问题