0

共有マネージャーを使用してRestKitで1回のGETリクエスト中に複数のモデルを更新しようとしています。

[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];

where にresponseDescriptorは、マッピング、キー パス、およびパス パターンがあります。

フェッチされる JSON には 5 つの個別のモデルが含まれており、空のアプリケーションから開始すると、合計 300 個のオブジェクト (さまざまなタイプ) など、かなりのサイズになる可能性があります。一般的な構造を示す編集された例を次に示します。そのように見えますが、アプリにはさらに多くの機能があります。

{
"rooms":[{"id":1,"name":"Hall A"},{"id":2,"name":"Hall B"}],
"sessions":[{"id":168,"title":"Pre-emptive value-added strategy","room_id":1}]
}

あるマッピングではRKConnectonDescription、CoreData が外部キーに基づいて関連していることを認識できるように使用しようとしています。例えば:

    NSRelationshipDescription *roomRelationship = [_sessionMapping.entity relationshipsByName][@"room"];
    [_sessionMapping addConnection:[[RKConnectionDescription alloc] initWithRelationship:roomRelationship attributes:@{ @"roomRemoteId": @"remoteId" }]];

すべての CoreData オブジェクトは、json 経由で取得される ID の識別属性として remoteId プロパティを使用します。たとえば、セッション マッピングは次のようになります。

    _sessionMapping = [RKEntityMapping mappingForEntityForName:@"Session" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore];
    _sessionMapping.identificationAttributes = @[ @"remoteId" ];
    [_sessionMapping addAttributeMappingsFromDictionary:@{
     @"id" : @"remoteId",
     @"title": @"title",
     @"room_id": @"roomRemoteId"}];

部屋のマッピングは次のようになります。

    _roomMapping = [RKEntityMapping mappingForEntityForName:@"Room" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore];
    _roomMapping.identificationAttributes = @[ @"remoteId" ];
    [_roomMapping addAttributeMappingsFromDictionary:@{
     @"id" : @"remoteId",
     @"name": @"name"
     }];

私が見つけたのは、空のデータベースから開始してすべてのオブジェクトを取得すると、一部のセッションだけが部屋を持っているということです。セッション モデルにはroomRemoteIdフィールドがあり、ルームにはremoteId. 部屋のないセッションの 1 つをスポット チェックしたところ、roomRemoteIdセットがありremoteId、データベースでその部屋を検索できました。

セッションの約 25% は問題ないように見えますが、残りの 75% にはroomRemoteIdルーム リレーションが設定されていますが、設定されていません。

問題は、一部のセッションが正しくマップされ、他のセッションがマップされないのはなぜでしょうか?

4

1 に答える 1

0

良い提案をしてくれたWainに感謝します!グローバルな Restkit ログ レベルをトレースに上げた後、Room for で逆の関係があることに気付きましたsessionsが、間隔を空けて 1 対多にしなかったことに気付きました。次のようなログ エントリが多数ありました。

D restkit.core_data:RKRelationshipConnectionOperation.m:198 Connected relationship 'room' to object '<Room: 0x96fad00> (entity: Room; id: 0x1082e150 <x-coredata:///Room/t3B6287B3-4478-4B64-9D83-9C85387C377D629> ; data: {
    name = 2204;
    remoteId = 24;
    sessions = "0x1081b320 <x-coredata:///Session/t3B6287B3-4478-4B64-9D83-9C85387C377D233>";
})'

しかし、その中に複数のセッションがあるものはありませんでした。これは、関係が正しく設定されておらず、マッピングが完全に機能していないという手がかりでした。すべてが期待どおりに機能することを修正したら。

セッション関係のプロパティのスクリーンショットを次に示します。To-Many Relationship ボックスをオフにすると、正しく機能しました。

Core Data 関係の XCode プロパティ シート

于 2013-06-20T01:00:49.693 に答える