[英]Why is CoreData not saved when I reopen the app in SwiftUI?
我遇到了涉及 CoreData 和終止應用程序的問題。 當我終止應用程序(即使我確實保存了托管 Object 上下文)並重新打開它時,由於某種原因它看起來仍然相同。 . .
我對 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)
}
}
是的。 . .我知道其中一些保存是不正確的。 . . 但我真的不知道如何使它工作。
我也有一些圖片可以用來理解我的意思:
這是第一張圖,多為最初的state:
這是 state,一旦我重新打開應用程序,它應該仍然存在。 . .但它沒有:
我看不到您在哪里設置了要保存的數據。 雖然您沒有列出您的核心數據 model,但我假設實體是Task
,屬性是title
、 priority
和completionState
狀態。 因此,要保存數據,需要在托管的 object 上下文中定義一個變量來保存數據,將數據添加到變量中,然后將數據保存在上下文中:
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
}
你所做的只是告訴上下文保存已經存在的數據而不以任何方式更改它。 我還會將此模式提取到您可以調用的 function 中,而不是將其放在操作表的每個部分中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.