2

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

例如,一组具体实体都扩展了相同的抽象实体,用于来自另一个类的多对多关系,该类在模型中将其属性类型指定为抽象类类型,允许 Set是两种具体类型的混合物。

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

这是一个最简单的例子。

我有一个名为的实体PlantName,它的namesSet 定义为 type NameComponent。我有一个抽象实体,NameComponent它有:searchString和. 它由两个子实体扩展:which has和which has 。timeStamptitleCommonNamelocaleLatinNametype

要导入的相关 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 不将单个记录生成为具体类的原因。

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

4

2 回答 2

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”。

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

这背后的逻辑:

shouldImport: 的 data 只是 id,我们无法从那里访问 localizable_type,所以我们只需预先设置一个私有属性(_localizable_type),并在导入期间使用它。

于 2014-03-12T10:53:30.790 回答
0

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

于 2012-08-03T06:22:34.630 回答