神奇记录导入多态关系



我使用MagicalRecord将数据导入到大量使用多态性的CoreData模型中。

例如,一组

扩展同一抽象实体的具体实体用于另一个类的多对多关系中,该类在模型中将其属性类型指定为 Abstract 类类型,从而允许 Set 是两种具体类型的混合。

MagicalRecord 不会从导入的数据生成正确的子实体。

下面是一个最简单的情况示例。

我有一个名为PlantName的实体,它有一个定义为类型NameComponentnames集。我有一个抽象实体NameComponent它有:searchStringtimeStamptitle。它由两个子实体扩展:CommonName具有localeLatinName具有type

要导入的 JSON 的相关代码段:

"names": [                                        /* NameComponent(s) */
    {"title": "Jade Plant", "locale": "en_us"},   /* CommonName - US English */
    {"title": "Crassulaceae", "type":4},          /* LatinName - Family */
    {"title": "Crassula", "type":5},              /* LatinName - Genus */
    {"title": "Ovata", "type":6}                  /* LatinName - Species */
]

导入运行后,如果我查看 SQLite 数据库,我发现所有记录都已作为抽象类类型导入,此外,每个具体类类型独有的所有属性都丢失了。

我唯一能找到这种工作示例的地方是在 MagicalRecord 的单元测试中。然而,即使在一个重要的地方也是如此。测试关系是具体类型的,而我的关系是由抽象类类型化的。

我认为这种差异是导致MagicalRecord无法将单个记录生成为具体类的原因。

有没有办法解决这个问题?

我来这里是为了寻找一种用魔法记录实现多态的方法。我不确定我的回答对这个特定问题是否有帮助(特别是因为它:)晚了 18 个月),但一般来说,它应该适用于像我一样在这里借钱的人。

假设你有类似的东西(使用Rails):

class Event
  has_one :location, :as => :localizable, :dependent => :destroy
end
class User
  has_one :location, :as => :localizable, :dependent => :destroy
end
class Location
  belongs_to :localizable, :polymorphic => true
end

您的位置 json 如下所示:

{
  id: 1,
  localizable_id: 1,
  localizable_type: "Event"
}

你在 Xcode 中的 Location.m 可能看起来像这样:

@interface Location ()
@end

@implementation Location {
    NSString *_localizableType;
}
- (void) willImport:(id)data {
    _localizableType = [data valueForKey:@"localizable_type"];
}
- (BOOL) shouldImportEvent:(id)data;
{
    return [_attachableType isEqualToString:@"Event"];
}
- (BOOL) shouldImportUser:(id)data;
{
    return [_attachableType isEqualToString:@"User"];
}
@end

不要忘记在每个关系的数据模型用户信息中将映射的键名称设置为"localizable_id"。

请参阅轻松导入数据或浏览源代码以了解 willImport: 和 shouldImport: 回调以及如何设置 mappedKeyName。

这背后的逻辑:

shouldImport: 的数据只是 id,我们无法从那里访问localizable_type,所以我们只是事先设置了一个私有属性 (_localizable_type),并在导入过程中使用它。

这是我

在编写MagicalImport库时没有考虑过的情况。我将不得不将其添加为将来的更新。

最新更新