2012-07-04 75 views
2

我使用MagicalRecord將數據導入到大量使用多態性的CoreData模型中。MagicalRecord導入多態關係

例如,一組所有擴展相同抽象實體的具體實體都被用於與另一個類的多對多關係,該類具有在模型中指定爲屬於Abstract類類型的屬性類型,使Set成爲兩種具體類型的混合體。

MagicalRecord不會從導入的數據中生成正確的子實體。

這裏是最簡單的的例子。

我有一個名爲PlantName的實體,它具有一個names集合,定義爲NameComponent。 我有一個抽象實體NameComponent它有:searchString,timeStamptitle。 它由兩個子實體擴展: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不能生成單個記錄作爲具體類的原因。

有沒有辦法解決這個問題?

回答

0

這是我編寫MagicalImport庫時沒有考慮過的情況。我將不得不添加此作爲未來的更新。

+0

感謝您的回覆。我期待着使用這個功能:-) – Quinny

+0

剛剛遇到這個問題我自己 - 有沒有更新?否則,我將不得不編寫多態關係的支持。 –

+0

如果你這樣做,一定要提交拉請求。 – casademora

1

我來這裏尋找一種方法來實現與魔法記錄的多態性。我不確定我的回答會對這個問題有幫助(特別是自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" 
} 

你Location.m在Xcode可以看起來像:

@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:and shouldImport:回調以及如何設置mappedKeyName。

這背後的邏輯:

數據shouldImport:僅僅是ID,我們不能從那裏訪問localizable_type,所以我們只設置一個私有屬性(_localizable_type)事前,並在使用它進口。