我正在使用SwiftUI和Core Data编写iOS应用。我是Core Data的新手,请尝试了解以下内容:
为什么尝试self.moc.save()将self.item.isDeleted从true更改为false?在删除核心数据对象(isDeleted更改为true)之后,但后来保存托管对象上下文将其更改为false时,会发生这种情况。这是为什么?
这是一个例子:
ContentView.swift
import SwiftUI
struct ContentView: View {
@Environment(\.managedObjectContext) var moc
var fetchRequest: FetchRequest<Item>
var items: FetchedResults<Item> { fetchRequest.wrappedValue }
var body: some View {
NavigationView {
List {
ForEach(items, id: \.self) {item in
NavigationLink(destination: DetailsView(item: item)) {
Text("\(item.name ?? "default item name")")
}
}
}
.navigationBarTitle("Items")
.navigationBarItems(
leading:
Button(action: {
for number in 1...3 {
let item = Item(context: self.moc)
item.date = Date()
item.name = "Item \(number)"
do {
try self.moc.save()
}catch{
print(error)
}
}
}) {
Text("Add 3 items")
}
)
}
}
init() {
fetchRequest = FetchRequest<Item>(entity: Item.entity(), sortDescriptors: [
NSSortDescriptor(keyPath: \Item.name, ascending: true)
])
}
}
DetailsView.swift
import SwiftUI
struct DetailsView: View {
@Environment(\.managedObjectContext) var moc
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var item: Item
var body: some View {
VStack {
Text("\(item.name ?? "default item name")")
}
.navigationBarItems(
trailing:
Button(action: {
self.moc.delete(self.item)
print(self.item.isDeleted)
self.presentationMode.wrappedValue.dismiss()
print(self.item.isDeleted)
do {
try self.moc.save()
print(self.item.isDeleted)
}catch{
print(error)
}
}) {
Text("Delete")
.foregroundColor(.red)
}
)
.onDisappear {
print(self.item.isDeleted)
if !self.item.isDeleted {
print(self.item.isDeleted)
self.item.name = "new name"
print(self.item.isDeleted)
do {
try self.moc.save()
}catch{
print(error)
}
}
}
}
}
我预期会发生:
没用 我在几行上添加了print(self.item.isDeleted)并在这些行上添加了断点,以检查到底发生了什么。
这是怎么回事:
是虫子吗?还是我不了解Core Data对象和isDeleted更改的生命周期?
为什么尝试self.moc.save()将self.item.isDeleted从true更改为false?在删除核心数据对象(isDeleted更改为true)之后,但后来保存托管对象上下文将其更改为false时,会发生这种情况。这是为什么?
它的行为与所记录的一样-在保存之前返回true ,在其他情况下则不返回
这是Apple文档的快照NSManagedObject
:
概要
一个布尔值,指示是否 在下一次保存期间将被管理对象删除。宣言
var isDeleted:Bool {get}讨论
如果Core Data将在下一次保存操作期间要求持久性存储删除对象,则为true,否则为false。在其他时间,它可能返回false,尤其是在删除对象之后。它停止返回true的直接性取决于对象在删除过程中的位置。如果接收器有故障,则访问此属性不会导致其触发。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句