2

私は MagicalRecord を使用して、ポリモーフィズムを多用する CoreData Model にデータをインポートします。

たとえば、すべてが同じ抽象エンティティを拡張する具体的なエンティティのセットは、別のクラスからの多対多の関係で使用されます。別のクラスのプロパティ タイプはモデルで Abstract クラス タイプとして指定されており、Set を許可します。両方の具体的なタイプの混合であること。

MagicalRecord は、インポートされたデータから正しいサブ エンティティを生成しません。

最も単純なケースの例を次に示します。

type として定義されPlantNameた Set を持つというエンティティがあります。、およびを持つ抽象エンティティがあります。これは、2 つのサブエンティティによって拡張されます: which hasとwhich has 。namesNameComponentNameComponentsearchStringtimeStamptitleCommonNamelocaleLatinNametype

インポートする 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 に答える