2012-02-16 8 views
8

RestKitのObject Mapping-Guide on GitHubを読んだ後、私の問題は消えませんでした。だから、RestKitが次のアイデアに対処できるかどうか誰かが言うことができます。関係RestKitオブジェクトマッピング関係KVCなし

Company 
- unitID 
- companyID 
- name 
- contacts* (Company -->> Contact | 1:n) 

Contact 
- unitID 
- companyID 
- contactID 
- lastName 
- firstName 
- account* (Contact >--> Company | 1:1) 

JSON(会社)との

エンティティ

[ 
    { 
     "unitID":"003CABD8DEB5DC13C", 
     "companyID":"BSP-002999", 
     "name":"Testcompany" 
    } 
] 

JSON(連絡先)

[ 
    { 
     "unitID":"DAC2ACCC125795D00", 
     "companyID":"BSP-002999", 
     "contactID":"CLP-015468", 
     "firstName":"Mister", 
     "lastName":"Wayne" 
    } 
] 

制限のため、所属する連絡先を会社にネストすることができません(そうでなければ私はこれを書いていません)ので、インポート時にデータがマッピングされたときにこの使い方をしたいと思います。

質問

は、各連絡先をマッピングすることが可能ですRestKitによって所定の方法でインポート時に(属性たCompanyIdで識別される)会社に属するのか?

もしそうでなければ、私はそれに最適な解決法を知りたいと思います。ありがとう!このアプリの私の最初のビルドで


背景

私は(関係なし)指定されたエンティティにオブジェクトをマッピングされ、述語企業IDを持つ企業へのすべての属する連絡先をフェッチしました=%@。データ量(4000以上の企業、7000以上の連絡先)のために、所属する連絡先をすべて取得するのに約1秒かかるので、リレーションシップを使用するというアイデアを思いつきました(ローカルダミーデータと完璧に機能します)。


ソリューション

私の現在のマッピング下記の答えの助けを借りて、以下の(RestKitのV.10)のように見えます。

// Setting up Restkit with objectStore 
... 

// Init objectMapping for Class Company 
companyMapping = [RKManagedObjectMapping mappingForClass:[Company class] inManagedObjectStore:objectStore]; 
[companyMapping mapKeyPath:@"unitID" toAttribute:@"unitID"]; 
[companyMapping mapKeyPath:@"companyID" toAttribute:@"companyID"]; 
[companyMapping mapKeyPath:@"name" toAttribute:@"name"]; 
companyMapping.setDefaultValueForMissingAttributes = NO; 
companyMapping.primaryKeyAttribute = @"companyID"; 

// Init objectMapping for Class Contact 
contactMapping = [RKManagedObjectMapping mappingForClass:[Contact class] inManagedObjectStore:objectStore]; 
[contactMapping mapKeyPath:@"unitID" toAttribute:@"unitID"]; 
[contactMapping mapKeyPath:@"companyID" toAttribute:@"companyID"]; 
[contactMapping mapKeyPath:@"contactID" toAttribute:@"contactID"]; 
[contactMapping mapKeyPath:@"lastName" toAttribute:@"lastName"]; 
[contactMapping mapKeyPath:@"firstName" toAttribute:@"firstName"]; 
contactMapping.setDefaultValueForMissingAttributes = NO; 
contactMapping.primaryKeyAttribute = @"contactID"; 

// Init relationships 
[contactMapping mapRelationship:@"company" withMapping:companyMapping]; 
[contactMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"]; 

// Get objects from server 
... 

+0

あなたは、この例の作業ソリューションを共有していただけますか? :)マッピングのためだけに –

+2

上記の私のエントリを設定例で更新しました。それが役に立てば幸い! – flashfabrixx

答えて

12

はい、RestKitは、マッピング時にあなたのために、この関係を水和することができます。あなたの連絡先のモデルのためのあなたのRKManagedObjectMappingでは、次の操作を実行する必要があります。

  • 親会社に関係のマッピングを追加します。[objectMapping mapRelationship:@"company" withMapping:companyMapping]
  • は、あなたが持っていることを確認してくださいあなたの連絡先モデル
  • に企業ID属性の地図RestKitが持っている後[objectMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"];

:primaryKeyAttribute関係を水和するために両方のクラス

  • 指示しRestKit上に設定しますペイロードのマッピングが完了したら、それはコレクションを通って戻り、関係を水和させます。ペイロードが実際に接続を満たすために必要なオブジェクトを作成する場合は、マッピングが完了するまで処理が遅延されます。

    開発ブランチには、代替ワークフローが用意されています。今週初めに、ペイロードにIDの配列を使用して多対多の関係を水和するサポートを追加しました。これにより、会社に所属する連絡先のリストをペイロードに送信することができます。あなたのユースケースの方が効率的かもしれません。 RestKitメーリングリストへの私のポストから

    その他の詳細:http://groups.google.com/group/restkit/msg/416951f86b2862d1

  • +0

    あなたの早い再生のためにありがとう - それは魅力のように働く!私は今、GitHub/Googleのプロジェクトを見ています。なぜなら、このプロジェクトでは2番目のアイデアが素晴らしいと思われるからです。 – flashfabrixx

    +0

    あなたは私の一日を救った! :)水和したい親エンティティを指しているエンティティに外部キーが必要なようです。とにかく、私はすべての種類のドキュメントとサンプルを見てきましたが、私はそれがどのように機能するかは分かりません。これは、これまでのところ、このことを最終的にどうやって動作させるかについての最良の説明です! – Hlung

    関連する問題