KVCなしで関係をマッピングするRESTKITオブジェクト
-
26-10-2019 - |
質問
読んだ後 GitHubのオブジェクトマッピングガイド Restkitの場合、私の問題は消えませんでしたので、おそらく誰かがRestkitが次のアイデアに対処できるかどうかを言うことができます。
関係のあるエンティティ
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"
}
]
制限のため、私は所属連絡先を企業にネストすることができません(そうでなければこれを書くことはありません)。そのため、データがインポートにマッピングされたときにこれを行いたいと思います。
質問
各連絡先を所属会社にマッピングすることは可能ですか(属性によって識別されます CompanyId)RESTKITによる指定されたメソッドを使用したインポートについて?
そうでない場合は、最良の解決策を知りたいです。ありがとう!
バックグラウンド
このアプリの最初のビルドでは、特定のエンティティにオブジェクトをマッピングし(関係なし)、Predicateを持つ会社にすべての帰属連絡先を取得しました companyId =%@. 。データの量(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
...
解決
はい、RESTKITはマッピング時間にこの関係を水分補給できます。連絡先モデルのrkmanagedObjectマッピングでは、以下を実行する必要があります。
- 親会社に関係マッピングを追加します。
[objectMapping mapRelationship:@"company" withMapping:companyMapping]
- CompanyID属性を連絡先モデルにマップします
- PrimaryKeyAttributeが両方のクラスで構成されていることを確認してください
- Restkitに関係を水分補給するよう指示してください。
[objectMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"];
RestKitがペイロードのマッピングを完了した後、コレクションを通過し、関係を補給します。ペイロードが実際に接続を満たすために必要なオブジェクトを実際に作成する場合に、マッピング後まで処理が延期されます。
開発ブランチには、利用可能な代替ワークフローがあります。今週初めに、ペイロード内のIDの配列を使用して、多くの多くの関係を補給するためのサポートを追加しました。これにより、代わりにペイロードで会社に属する連絡先のリストを送信できます。ユースケースにより効率的になる場合があります。
私の投稿からRESTKITメーリングリストへの追加の詳細: http://groups.google.com/group/restkit/msg/416951f86b2862d1