删除关系对象时更新NSFetchedResultsController对象

时间:2017-11-17 15:45:21

标签: ios swift core-data nsfetchedresultscontroller

假设我的 FetchedResultsController 中有对象。对象与另一个名为 Category 的实体有关系。如果用户未设置类别或所选类别,则此值可以为零。用户可以随时删除和创建类别。

但是,当一个类别被删除时,具有特定类别的对象,而不是nil作为类别属性,它具有特定的类别,它不再存在,给我一个错误。< / p>

如何更新我的frc对象,以便在删除类别时,将category属性设置为已删除类别的每个其他对象将当前类别设置为nil

这是我在frc中保存数据的方式:

   func save(sumText: String, dataDescription: String, dataColor: UIColor, category: Categories?, type: String, completion: (_ finished: Bool) -> ()) {
        let budget = NSEntityDescription.insertNewObject(forEntityName: "Budget", into: managedObjectContext!) as! Budget

        budget.dataSum = sumText
        budget.dataDescription = dataDescription
        budget.dataColor = dataColor
        budget.dateSubmitted = Date()
        budget.dateSection = formatDate(date: Date())
        budget.type = type

        if let cat = category {
            budget.category = cat
        }


        do{
            try managedObjectContext?.save()
            print("Succesfully saved data")
            completion(true)
        } catch {
            debugPrint("Could not save \(error.localizedDescription)")
            completion(false)
        }
    }

这是我删除类别的方法:

    let deleteAction = SwipeAction(style: .destructive, title: "Sterge") { (action, indexPath) in

        guard let managedContext = appDelegate?.persistentContainer.viewContext else { return }

        managedContext.delete(userCategories[indexPath.row])

        do {
            try managedContext.save()
        } catch {}

        self.fetchCoreDataObject()
        tableView.reloadData()

    }

因此,当我删除类别时,我必须将所有具有该类别的对象更新为nil,但我不知道如何。

The relationship

1 个答案:

答案 0 :(得分:0)

您需要做的就是将删除规则指定为Nullify

enter image description here

当您使用Nullify删除规则时,在删除对象时,其引用作为其关系一部分的所有其他对象将按预期初始化为nil。您不需要为此编写代码。

现在代码中出现问题:

查看您发布的模型,我可以看到Budget实体与名称Categories的{​​{1}}实体存在关系(一对一)。现在,如果您只是选择category关系并将删除规则设置为category,则删除Nullify Budget会将其引用设为nil但这不是您想要的。

首先,当您命名实体拇指规则之间的关系时 实体名称1 - &gt;关系名称 - &gt;实体Name2应该发表声明并明确解释这种关系。

示例:预算isOfType类别

反转可以是:类别用于预算。

但是如你所示,使用不可能是一对一的关系。类别可以在多个预算中使用。你不想为每个预算实体创建一个单独的类别吗?

enter image description here

让我们最后指定删除规则。删除Category时,预算中的所有Category引用都应设置为无正确。因此,选择类别实体,突出显示usedBy关系并将删除规则设置为Nullify

enter image description here

最后,如果用户删除预算,则类别应保持不变,因此选择预算,突出显示isOfType并将删除规则设置为

enter image description here

希望这会有所帮助:)