我可以对具有删除规则的关系的实体使用NSBatchDeleteRequest吗?

时间:2015-10-02 21:07:12

标签: core-data

我正在尝试使用NSBatchDeleteRequest删除一堆实体,其中许多实体都删除了级联和/或无效规则。

我第一次尝试删除任何内容都失败了,我收到的NSError包括字符串“批删除不支持删除规则”。我原以为删除这些东西很好,但是我负责确保在保存之前满足所有约束条件。

我是否可以批量删除这些托管对象? (我想保留删除规则,其他删除路径没有简单的方法来知道要删除哪些对象集合)在这种情况下,某些类型的批删除是否有效,但其他没有? (说谓词失败,但是对象ID列表有效吗?)

3 个答案:

答案 0 :(得分:6)

批量删除与关系有问题。

它直接进入数据库并删除暂停所有对象图规则的记录,包括删除规则。您已经正确地确定了需要再次自行执行所有约束检查的要求。 (这本身可能是一个交易破坏者。)

即使你设法正确删除了实体和所有必要的相关实体,你仍然会在(不透明的)连接表中留下大量条目。核心数据在后台创建。没有明显的安全方法来删除连接表中的条目,并且已报告它们会干扰管理未来操作中的关系。

IMO,在这种情况下,解决方案仍然是使用对象图,而不是批量删除和优化性能。关于如何做到这一点,关于SOF有很多好的答案,但大部分都可以用以下几点来概括:

  • 找到正确的批量大小进行保存(通常有500个实体用于创建,大约2000个用于删除,但这可能因对象大小和关系复杂性而异 - 您必须进行实验)。
  • 如果您有内存限制,请使用autoreleasepool s。
  • 使用背景上下文释放UI以进行交互。我更喜欢在更新UI后在后台保存到数据库。

答案 1 :(得分:0)

我刚刚写了一个简单的Department-Employee(一对多)演示项目。 Empolyee department关系的删除规则设置为cascade

使用批量删除删除带有department的{​​{1}}时,已删除对象的数量仅为1 。因此,暂时批量删除会忽略删除规则

你可以为自己尝试:

employees

答案 2 :(得分:0)

如果有人需要这个: 您可以为父实体和子实体使用两个 NSBatchDeleteRequest

    let childFetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "ChildEntityName")
    let childDeleteRequest = NSBatchDeleteRequest(fetchRequest: childFetchRequest)
    do {
        try persistenceService.context().execute(childDeleteRequest)
        let parentFetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "ParentEntityName")
        let parentDeleteRequest = NSBatchDeleteRequest(fetchRequest: parentFetchRequest)
        do {
            try persistenceService.context().execute(parentDeleteRequest)
            
            persistenceService.saveContext()

            /// handle success

        } catch {
            persistenceService.context().reset() // for example
            /// handle error
        }
    }catch {
        /// handle error
    }