【问题标题】:Deleting all nested data删除所有嵌套数据
【发布时间】:2021-08-23 13:54:54
【问题描述】:

我有四个模型Subject > Topic > Content > Block

  • 删除Subject 时,我还想删除嵌套的TopicContentBlock

  • 删除Topic 时,我想删除嵌套的ContentBlock

  • 删除Content 时,我想删除嵌套的Block

我该怎么做?

【问题讨论】:

  • 你尝试了什么,你遇到了什么问题?
  • 你们为什么要投票给我。这让我很难过。

标签: swift core-data


【解决方案1】:

单击您的 xcdatamodel 文件。点击你想要的关系。单击检查器并选择删除规则。在您的情况下,您想从主题>主题等级联,所以只需从每个中选择级联。

在检查器中的删除规则下拉菜单中选择级联。

[2

【讨论】:

  • 我这样做了。但它在这里和那里删除了一些数据。 :-(
  • 我想手动完成,完全控制!
  • 嗯,我怀疑问题可能出在其他地方,CoreData 非常擅长管理数据库。我知道只有一种方法可以手动删除它们,那就是按顺序获取它们并删除或以其他方式收集他们的所有 ID 并删除。我会说,如果您经常在调试器中停止并重新启动某些东西可能无法保存。如果要达到断点,您可能希望在删除后告诉上下文保存。
  • @TimoMüller “但它在这里和那里删除了一些数据” - 绝对应该调查!正如 SeaSpell 已经指出的那样:“我怀疑问题可能出在其他地方”。
【解决方案2】:

我试图把它放在 cmets 中,但它太小而看不见。我不建议强制 CoreData 我认为问题可能出在其他地方,我肯定会考虑一下。但在紧要关头,您可以删除引用。

我认为这段代码是对的:

        func delete(_ item: NSManagedObject) {
        let context = item.managedObjectContext!
        
        switch item.entity.name {
            case .some("Subject"):
                (item as! Subject).topic.forEach({delete($0)})

            case .some("Topic"):
                (item as! Topic).content.forEach({delete($0)})

            case .some("Content"):
                (item as! Content).block.forEach({delete($0)})

            default:
                break
        }
       
        context.delete(item)
    }

我现在没有快速的测试方法。 但是像这样的递归可能是你最好的选择。

【讨论】:

    猜你喜欢
    • 2021-07-09
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    相关资源
    最近更新 更多