为啥我在 SwiftUI 中重新打开应用程序时没有保存 CoreData?

Posted

技术标签:

【中文标题】为啥我在 SwiftUI 中重新打开应用程序时没有保存 CoreData?【英文标题】:Why is CoreData not saved when I reopen the app in SwiftUI?为什么我在 SwiftUI 中重新打开应用程序时没有保存 CoreData? 【发布时间】:2020-11-30 13:10:47 【问题描述】:

我遇到了涉及 CoreData 和终止应用程序的问题。当我终止应用程序(即使我保存了托管对象上下文)并重新打开它时,由于某种原因它看起来仍然相同。 . .

我对 CoreData 有点陌生,但有没有办法更新数据?我还将分享应用程序的图片以供参考和下面的代码:

List
   ForEach(tasks, id: \.id) task in CellView(completionState: task.completionState, title: task.title!,
 priority: task.priority ?? "")


这段代码在 UI 中用于显示数据,它可以工作,那么我们就有了 CellView 结构

struct CellView: View 
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(entity: Task.entity(), sortDescriptors: []) var tasks: FetchedResults<Task>
    
    @State  var completionState: Bool
    @State  var title: String
    @State  var priority: String
    @State  var actionSheetPresented = false

    var body: some View 
        HStack
            //Mark task complete//
            Button(action: 
                completionState.toggle()
                do 
                        try self.moc.save()
                     catch 
                        let nserror = error as NSError
                        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
                    
            ) 
                switch completionState
                case false:
                    Image(systemName: "square")
                        .resizable()
                    
                    
                case true:
                    Image(systemName: "checkmark.square")
                        .resizable()
                        .foregroundColor(.green)
                    
                
                
            
            .frame(width: 30, height: 30, alignment: .center)
            .buttonStyle(PlainButtonStyle())
            
            Text(title)
                .foregroundColor(.black)
            
            Spacer()
            
            switch priority 
            case "Dorment":
                
                Button(action: self.actionSheetPresented.toggle()) 
                    Image(systemName: "zzz")
                        .resizable()
                        .frame(width: 30, height: 30, alignment: .center)
                
                .buttonStyle(PlainButtonStyle())
                .padding(.trailing, 10.0)
                
                
                
            default:
                Button(action: self.actionSheetPresented.toggle()) 
                    
                    Text(priority)
                        .background(Image("buttonBackground")
                                        .resizable()
                                        .frame(width: 40, height: 40, alignment: .center)
                                        .cornerRadius(30.0))
                        .foregroundColor(.white)
                
                .buttonStyle(PlainButtonStyle())
                .padding(.trailing)
                
            
            
        
        .actionSheet(isPresented: $actionSheetPresented, content: 
            ActionSheet(title: Text("Change the priority"), message: nil, buttons: [
                .default(Text("A")) 
                    priority = "A"
                    
                    do 
                        try self.moc.save()
                     catch 
                        let nserror = error as NSError
                        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
                    
                ,
                .default(Text("B")) 
                    priority = "B"
                    
                    do 
                        try self.moc.save()
                     catch 
                        let nserror = error as NSError
                        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
                    
                ,
                .default(Text("C")) 
                    priority = "C"
                    
                    do 
                        try self.moc.save()
                     catch 
                        let nserror = error as NSError
                        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
                    
                ,
                .default(Text("Dorment")) 
                    priority = "Dorment"
                    do 
                        try self.moc.save()
                     catch 
                        let nserror = error as NSError
                        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
                    ,
                .cancel()
            ])
        )
        .environment(\.managedObjectContext, self.moc)
    

是的。 . .我知道其中一些保存是不正确的。 . .但我真的不知道如何让它工作。

我还有一些图片可以用来理解我的意思:

这是第一张图,主要是初始状态:

这是我重新打开应用程序后应该保持的状态。 . .但它没有:

【问题讨论】:

【参考方案1】:

我看不到您在哪里设置了要保存的数据。虽然您没有列出您的核心数据模型,但我假设实体是Task,属性是titleprioritycompletionState。因此,要保存数据,需要在托管对象上下文中定义一个变量来保存数据,将数据添加到变量中,然后将数据保存到上下文中:

let task = Task(context: self.moc)
task.title = self.title
task.priority = self.priority
task.completionState = self.completionState

do 
    try self.moc.save()
 catch 
    // catch any errors here  

您所做的只是告诉上下文保存已经存在的数据而不以任何方式更改它。我还会将此模式提取到您可以调用的函数中,而不是将其放在操作表的每个部分中。

【讨论】:

好吧,我会告诉你结果如何!

以上是关于为啥我在 SwiftUI 中重新打开应用程序时没有保存 CoreData?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SwiftUI 中的 URL Scheme/onOpenURL 总是打开一个新窗口?

为啥当我在 UIHostingController 中使用 SwiftUI-transition 时,它不能按预期工作?

我在excel中使用VBA宏程序时,报错无法执行,为啥!前提,程序没有问题,因为单位机器运行良好

为啥后台和重新打开应用程序不调用 viewDidAppear?

为啥将 ViewModel 添加到我的 SwiftUI 应用程序后我的 UI 没有更新?

SwiftUI,为啥部分视图没有刷新? @State 变量未更新