为什么保存受管对象上下文更改为isDeleted值?

锦葵

我正在使用SwiftUI和Core Data编写iOS应用。我是Core Data的新手,请尝试了解以下内容:

为什么尝试self.moc.save()self.item.isDeletedtrue更改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)
                }
            }
            
        }
        
    }
}

我预期会发生:

  1. self.moc.delete(self.item)将删除一个对象,并将self.item.isDeleted标记为true。
  2. 尝试self.moc.save将保存moc
  3. 如果!self.item.isDeleted将在项目被删除时阻止代码执行(没有此操作,我得到一个错误:在删除托管对象(...)之后对其进行突变)

没用 在几行上添加了print(self.item.isDeleted)并在这些行上添加了断点,以检查到底发生了什么。

这是怎么回事:

  1. self.moc.delete(self.item)删除了一个对象,并将self.item.isDeleted标记为true。
  2. 尝试self.moc.save保存的moc和...
  3. self.item.isDeleted更改为false
  4. 如果!self.item.isDeleted没有阻止代码执行,因为isDeleted在此时为false。

是虫子吗?还是我不了解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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

iOS-受管对象上下文异常

来自分类Dev

当我们将方法存储在变量中然后调用它时,为什么上下文对象更改为全局窗口对象?

来自分类Dev

为什么来自父上下文的更改会自动转到子上下文?

来自分类Dev

为什么进行上下文切换时Linux为什么保存%ebp?

来自分类Java

什么是上下文对象设计模式?

来自分类Dev

什么是Vuex“上下文”对象?

来自分类Dev

为什么意图需要上下文?

来自分类Dev

为什么上下文=无?

来自分类Dev

保存上下文

来自分类Dev

顺序函数调用的执行上下文-更改为窗口

来自分类Dev

角管模板上下文

来自分类Dev

受管理对象上下文是事务日志吗?

来自分类Dev

为什么在实例化函数上下文时会对其进行更改?

来自分类Dev

为什么“等待”更改WinForms program.cs中的线程上下文

来自分类Dev

取消EF上下文更改后,为什么不更新集合?

来自分类Dev

为什么要创建上下文而不是仅导出对象?

来自分类Dev

为什么必须通过环境变量传递Core Data上下文对象?

来自分类Dev

为什么在托管对象和上下文之间存在弱引用?

来自分类Dev

为什么规则在对象的上下文中执行多次?

来自分类Dev

为什么对象实例中的枚举具有静态上下文?

来自分类Dev

为什么编译器允许在静态上下文中创建非静态类的对象?

来自分类Dev

为什么在定义了一些从对象到变量上下文的方法后丢失了?

来自分类Dev

为什么 ANTLR 生成的解析器会重用上下文对象?

来自分类Dev

为什么我的上下文中有一个空对象?

来自分类Dev

我不明白为什么使用set属性设置在构造函数的执行上下文中定义的值不会更改该值

来自分类Dev

为了更改Typescript中来自Consumer的上下文,设置什么作为Provider的值?

来自分类Dev

为什么在F的上下文中Deferred工厂方法具有返回值

来自分类Javascript

反应:为什么我的上下文值没有更新?

来自分类Dev

反应:为什么我的上下文值没有更新?

Related 相关文章

  1. 1

    iOS-受管对象上下文异常

  2. 2

    当我们将方法存储在变量中然后调用它时,为什么上下文对象更改为全局窗口对象?

  3. 3

    为什么来自父上下文的更改会自动转到子上下文?

  4. 4

    为什么进行上下文切换时Linux为什么保存%ebp?

  5. 5

    什么是上下文对象设计模式?

  6. 6

    什么是Vuex“上下文”对象?

  7. 7

    为什么意图需要上下文?

  8. 8

    为什么上下文=无?

  9. 9

    保存上下文

  10. 10

    顺序函数调用的执行上下文-更改为窗口

  11. 11

    角管模板上下文

  12. 12

    受管理对象上下文是事务日志吗?

  13. 13

    为什么在实例化函数上下文时会对其进行更改?

  14. 14

    为什么“等待”更改WinForms program.cs中的线程上下文

  15. 15

    取消EF上下文更改后,为什么不更新集合?

  16. 16

    为什么要创建上下文而不是仅导出对象?

  17. 17

    为什么必须通过环境变量传递Core Data上下文对象?

  18. 18

    为什么在托管对象和上下文之间存在弱引用?

  19. 19

    为什么规则在对象的上下文中执行多次?

  20. 20

    为什么对象实例中的枚举具有静态上下文?

  21. 21

    为什么编译器允许在静态上下文中创建非静态类的对象?

  22. 22

    为什么在定义了一些从对象到变量上下文的方法后丢失了?

  23. 23

    为什么 ANTLR 生成的解析器会重用上下文对象?

  24. 24

    为什么我的上下文中有一个空对象?

  25. 25

    我不明白为什么使用set属性设置在构造函数的执行上下文中定义的值不会更改该值

  26. 26

    为了更改Typescript中来自Consumer的上下文,设置什么作为Provider的值?

  27. 27

    为什么在F的上下文中Deferred工厂方法具有返回值

  28. 28

    反应:为什么我的上下文值没有更新?

  29. 29

    反应:为什么我的上下文值没有更新?

热门标签

归档