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

Update NSFetchedResultsController object when relationship object was deleted

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

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

如何更新我的 frc 对象,以便在删除类别时,将类别 属性 设置为已删除类别的所有其他对象将当前类别设置为 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,但我不知道如何。

您只需将删除规则指定为Nullify

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

现在在您的代码中出现问题:

查看您发布的模型,我可以看到 Budget 实体与 Categories 名称 category 的实体具有关系(一对一)。所以现在如果你简单地 select category 关系并将删除规则设置为 Nullify 删除 Budget Category 将其引用为 nil 但那不是你想要什么。

首先,当您命名实体拇指规则之间的关系时, Entity Name1 -> RelationShip name -> Entity Name2 应该声明并明确解释关系。

示例:预算 isOfType 类别

反向可以是:Category is usedBy Budget。

但是 usedBy 不能像您所显示的那样是一对一的关系。类别可以在多个预算中使用。您不想为每个预算实体创建一个单独的类别吗?

最后让我们指定删除规则。当您删除 Category 时,预算中的所有 isOfType 参考应设置为 nil 正确。所以 select 类别实体,突出显示 usedBy 关系并将删除规则设置为 Nullify

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

希望对您有所帮助:)