如何使用 RestKit 序列化多态对多核心数据关系?

Posted

技术标签:

【中文标题】如何使用 RestKit 序列化多态对多核心数据关系?【英文标题】:how to serialize polymorphic to-many Core Data relationship with RestKit? 【发布时间】:2013-04-25 05:20:42 【问题描述】:

我需要序列化一个与抽象实体 (Question) 具有一对多关系 (questions) 的核心数据类 (Questionnaire)。

Question 是许多具体子类(BooleanQuestionClosedQuestion...)的父实体,每个子类都有一个 RKManagedObjectMapping

如何设置问卷映射来序列化这种多态关系?

如果它不是多态的,我会这样做:

[questionnaireMapping mapRelationShip:@"questions" withMapping:[questionMapping inverseMapping]];

但我不能这样做:问题不会属于任何单一类别,因此没有单一的映射可以传递。

此外,问题是抽象的,甚至没有映射(尽管我可以定义一个)。

如何使用 RestKit 版本 0.10.3 处理?

请注意,我的产品即将发布,我真的不愿意在我的产品周期后期迁移到 RestKit 0.20。

我想我可以将所有具体的 Question 子类聚合到 Question 中,使其具体化和单态(和整体)。那会很难看(尽管我相信这正是 Core Data 在幕后对 SQLite 所做的)。

还有更优雅的吗?

谢谢

京东

【问题讨论】:

【参考方案1】:

无论如何升级到 0.20 也无济于事,因为我不相信这种情况也包括在内。

我建议您在层次结构中的每个类上实现一个方法(或只使用KVC),该方法返回一个键和值的字典。这可以使用KVC -dictionaryWithValuesForKeys: 有效地完成。键列表应该是所有类的所有键的并集。现在您可以构建一个可以映射的字典数组。您还需要实现 KVC -valueForUndefinedKey: 以防止在此过程中出现异常。

现在,在您的 Questionnaire 类上,您可以实现一个方法来循环 questions 关系内容并构建字典列表。假设该方法名为encodedQuestions,您的映射将类似于:

[questionnaireMapping mapRelationShip:@"encodedQuestions" withMapping:questionDictMapping];

我实际上并没有尝试过这样做,所以有一个问题是关于 RestKit 在 Core Data 对象上使用的反射以及它对你的关系映射有多满意。

【讨论】:

以上是关于如何使用 RestKit 序列化多态对多核心数据关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RestKit 正确测试映射(嵌套映射,对多)

RestKit 创建多对多关系

不使用 Web 服务时如何使用来自 RestKit 的核心数据?

Restkit 对多关系追加到集合而不是设置新集合

Laravel:如何在多态多对多中使用 wherePivot

RestKit 和核心数据 - 如何发布数据?