2

Parent継承するモデルと、を継承NSManagedObjectするChildモデルがありParentます。

Parentマッピングは次のとおりです。

RKManagedObjectStore* store = [RKObjectManager sharedManager].objectStore;
RKManagedObjectMapping* mapping = [RKManagedObjectMapping mappingForEntityWithName:@"Parent" inManagedObjectStore:store];
[mapping mapKeyPath:@"id" toAttribute:@"id"];
[[RKObjectManager sharedManager].mappingProvider addObjectMapping:mapping];

そしてChildマッピング:

RKManagedObjectStore* store = [RKObjectManager sharedManager].objectStore;
RKManagedObjectMapping* mapping = [RKManagedObjectMapping mappingForEntityWithName:@"Child" inManagedObjectStore:store];
[[RKObjectManager sharedManager].mappingProvider setMapping:mapping forKeyPath:@"child"];

次に、次の JSON オブジェクトをChildインスタンスにマップしようとすると:

{
  "child": {
    "id": 7
  }
}

RestKit トレースでは、次のマッピングが表示されChildます。

mappings => ()

Childマッピングがマッピングから継承されないのはなぜParentですか? マッピングの継承を機能させるには?

4

1 に答える 1

2

要するに、RestKit がサポートしていないため機能しません。私の意見では、サポートすべきではありません。

子マッピングに親マッピングを持たせたい場合は、それを子マッピングにも追加できます。これは、個別に記述する場合は 1 行のコードを追加するか、mapKeyPathsToAttributes:メソッドを使用する場合は数文字を追加するだけです。

あなたの特定の例について重要な点があります。1 つは、id は ObjC で予約されているため、属性名として 'id' を使用しないことです (実際に問題が発生するとは確信していませんが、少なくともコードで見ると混乱します)。

したがって、RestKit には「id」プロパティをマップするためのやや標準的な規則があります。これは、エンティティの名前を属性の先頭に追加することです。つまり、プロパティをParent持ち、parentIDプロパティChildを持ちchildIDます。これだけでも、これらの種類のプロパティ (特に主キー!) を継承することが、一般的なケースではお勧めできない理由を示しています。

さらに、RESTful サーバー用にある種の SQL ベースのバックエンドを使用するのが一般的です。これは、Core Data が持つ種類のエンティティ継承をサポートする場合とサポートしない場合があるため、オブジェクトがデバイスからサーバー上のデータにマップされる方法が複雑になります。たとえば、Rails は STI をある程度処理しますが、それよりも複雑な処理には gem やハックが必要です。

編集:(githubの問題から取得)誰かがこれを継承する方法を探しているのを見つけた場合、他のマッピングに基づいてマッピングを作成する比較的簡単な方法があります:

RKManagedObjectMapping* parentMapping = [RKManagedObjectMapping mappingForEntityWithName:@"Child" inManagedObjectStore:store];
parentMapping.primaryKeyAttribute = @"parentID";
[parentMapping mapKeyPathsToAttributes: @"id", @"parentID", @"property_one", @"propertyOne", @"parent_only_property", @"parentOnlyProperty"];
[[RKObjectManager sharedManager].mappingProvider setMapping:mapping forKeyPath:@"parent"];

RKManagedObjectMapping* childMapping = [parentMapping copy];
childMapping.primaryKeyAttribute = @"childID";
[childMapping removeMapping:[childMapping mappingForAttribute:@"parentID"]];
[childMapping removeMapping:[childMapping mappingForAttribute:@"parentOnlyProperty"];
[childMapping mapKeyPathsToAttributes:@"id", @"childID", @"child_only_property", @"childOnlyProperty"];
[[RKObjectManager sharedManager].mappingProvider setMapping:childMapping forKeyPath:@"child"];
于 2012-07-19T19:15:33.780 に答える