如何将所有相关的自相关对象放在带有每个关系映射的关联节标题的表格视图中?

Posted

技术标签:

【中文标题】如何将所有相关的自相关对象放在带有每个关系映射的关联节标题的表格视图中?【英文标题】:How to put all related self-related objects in a tableview with associated section header for each relationship mapping? 【发布时间】:2020-05-08 17:54:15 【问题描述】:

我有一个名为“技能”的实体。 Skill 对于三种不同的类型具有与其自身的关系映射 - 更容易、更难和相似。

我想创建一个包含 3 个部分的表格视图 - 对于我碰巧正在查看的特定技能,更容易、更难和类似。我正在尝试确定如何使用 NSFetchedResultsController 创建一个获取请求,以将所有这 3 种技能合二为一。这是我的尝试

fileprivate lazy var relatedSkillsFetchedResultsController: NSFetchedResultsController<Skill> = 
        let appDelegate =
            UIApplication.shared.delegate as? AppDelegate
        let managedContext =
            appDelegate?.persistentContainer.viewContext
        let request: NSFetchRequest<Skill> = NSFetchRequest(entityName: "Skill")
        request.predicate = NSPredicate(format: "%@ IN self.easier OR %@ IN self.harder OR %@ IN self.similar", skill!,skill!,skill!)
        let skillFetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: managedContext!, sectionNameKeyPath: #keyPath(skill.relationshipFetchName), cacheName: nil)
        return skillFetchedResultsController
    ()

我在想 - 因为更容易是更难的倒数,更难的倒数是更容易的倒数,相似是相似的倒数......主要技能是那些更难或更容易或相似的技能。

这听起来像是正确的方法吗?

我也不知道如何设置 sectionNameKeyPath。它基本上对应于它匹配的三个 NSPredicate OR 中的哪一个?

【问题讨论】:

【参考方案1】:

配置 FRC 的困难不是找到sectionNameKeyPath,尽管这可能很困难,而是获得与所需部分一致的排序描述符:与获取请求兼容的排序描述符相对有限。

在您的情况下,我很想只创建一个从 Skill 到自身的单一自反关系 (relatedSkills),但要向 Skill 实体添加一个整数属性,以表示 difficulty。您可以决定等级(例如 0-9、0-99 等等)并决定要判断两种技能的难度必须有多接近(例如 +/-1 或 +/-2 等)“类似”。

然后您可以使用谓词仅选择与您选择的技能相关的技能:

NSPredicate(format:"ANY relatedSkills == %@", chosenSkill)

并添加基于difficulty 的排序描述符。然后定义一个函数来确定(使用您决定的规则)任何给定的技能是“更容易”、“相似”还是“更难”。该函数将是您的sectionNameKeyPath

更新

嗯,经过一夜的思考,我意识到我错了。在上面的场景中,sectionNameKeyPath 是一个难点:问题是它取决于当前选择的技能,但函数可以不带参数,所以无法“知道”当前选择的技能是什么。回到绘图板......

【讨论】:

以上是关于如何将所有相关的自相关对象放在带有每个关系映射的关联节标题的表格视图中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将表与中间表和附加相关列spring hibernate mvc连接起来

在Objection.js中,设置RelationMappings有什么好处?

如何将带有索引列表的dict映射到新变量

Mybatis相关概念

ORM的相关操作

关系对象映射 c#