多态关系的 MagicalRecord 导入
Posted
技术标签:
【中文标题】多态关系的 MagicalRecord 导入【英文标题】:MagicalRecord import of polymorphic relationship 【发布时间】:2012-07-04 20:37:39 【问题描述】:我使用 MagicalRecord 将数据导入到大量使用多态性的 CoreData 模型中。
例如,一组具体实体都扩展了同一个抽象实体,用于来自另一个类的多对多关系,该类在模型中将其属性类型指定为抽象类类型,允许Set 是两种具体类型的混合物。
MagicalRecord 不会从导入的数据中生成正确的子实体。
这是一个最简单案例的例子。
我有一个名为PlantName
的实体,它有一个names
集合,定义为NameComponent
类型。
我有一个抽象实体NameComponent
,它有:searchString
、timeStamp
和title
。
它由两个子实体扩展:CommonName
具有 locale
和 LatinName
具有 type
。
要导入的JSON相关sn-p:
"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 无法将单个记录生成为具体类的原因。
有没有办法解决这个问题?
【问题讨论】:
【参考方案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),并在导入时使用它。
【讨论】:
【参考方案2】:这是我在编写 MagicalImport 库时没有考虑过的情况。我必须将其添加为未来的更新。
【讨论】:
感谢您的回复。我期待使用该功能:-) 我自己也遇到了这个问题——有更新吗?否则,我将不得不编写对多态关系的支持。 如果这样做,请务必提交拉取请求。以上是关于多态关系的 MagicalRecord 导入的主要内容,如果未能解决你的问题,请参考以下文章