MagicalRecord导入多态关系

时间:2012-07-04 20:37:39

标签: objective-c core-data magicalrecord

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

例如,一组所有扩展相同抽象实体的具体实体在另一个类的多对多关系中使用,该关系具有在模型中指定为Abstract类类型的属性类型,允许Set是两种具体类型的混合体。

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

以下是最简单案例的示例。

我有一个名为PlantName的实体,其names集定义为NameComponent类型。 我有一个抽象实体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 DB,我发现所有记录都已作为抽象类类型导入,此外,缺少每个具体类类型唯一的所有属性。

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

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

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

2 个答案:

答案 0 :(得分:1)

我来到这里寻找一种用Magical Record实现多态性的方法。我不确定我的答案是否会对这个特定的问题有所帮助(尤其是自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

不要忘记将mappedKeyName设置为" localizable_id"在您的数据模型中,每个关系的用户信息。

请参阅Importing Data Made Easy或浏览源代码以了解willImport:和shouldImport:回调以及如何设置mappedKeyName。

背后的逻辑:

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

答案 1 :(得分:0)

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