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

Posted

技术标签:

【中文标题】删除关系对象时更新 NSFetchedResultsController 对象【英文标题】:Update NSFetchedResultsController object when relationship object was deleted 【发布时间】:2017-11-17 15:45:20 【问题描述】:

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

但是,当一个类别被删除时,具有特定类别的对象,而不是 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,但我不知道如何。

【问题讨论】:

我已经更新了答案:) 请看看。问题是从类别到预算的反向关系应该将删除规则设为无效,而不是从预算到类别的关系:) 这是你的情况。请阅读我的答案以了解更多信息:) 【参考方案1】:

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

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

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

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

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

示例:预算 isOfType 类别

逆可以是:类别按预算使用。

但 usedBy 不能是一对一的关系,如您所展示的。类别可用于多个预算。您不想为每个预算实体创建一个单独的类别吗?

让我们最后指定删除规则。当您删除 Category 时,预算中的所有 isOfType 引用应设置为 nil 正确。所以选择 Category Entity,突出 usedBy 关系并将删除规则设置为 Nullify

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

希望这会有所帮助:)

【讨论】:

已经设置为 Nullify。当我打印对象类别时,我得到Optional(<Categories: 0x600000298ba0> (entity: Categories; id: 0xd0000000001c0004 <x-coredata://D2833211-A127-423F-844A-B3D06C408524/Categories/p7> ; data: <fault>)) @andreivataselu :我正在更新我的答案,解释为什么你的 Nullify 不起作用 给我一分钟 好的,我按照你说的做了,现在可以了!非常感谢你的帮助!我真的是 CoreData 关系的初学者,你的回答让我明白了 @andreivataselu : 永远欢迎你,伙计 :) 很高兴我能帮上忙。快乐编码:)

以上是关于删除关系对象时更新 NSFetchedResultsController 对象的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 不会在使用 NSFetchedResultsController 更改模型时重新加载

Core Data 在更新时应用删除规则

NSManagedObject 已删除,但关系未更新

Core Data + iCloud,更改通知插入和删除关系中的对象但不更新关系中现有实体的属性

hibernate cascade

在删除一对一关系的核心数据期间发现 NSManagedObject 的问题