サーバーからの JSON 応答があります。RestKit ログから取得したデータは次のようになります。
sourceObject: (
{
place = {
"place_id" = "3cc1e372-f9d9-11e0-aba9-9415ab1a8034";
placeinfo = {
latitude = "12.5846738815";
longtitude = "55.6815948486";
"place_id" = "3cc1e372-f9d9-11e0-aba9-9415ab1a8034";
};
timestamp = "2011-10-19 00:33:44";
};
},
{
place = {
"place_id" = "b65e36e0-f9d9-11e0-aba9-9415ab1a8034";
placeinfo = {
latitude = "12.5720376968";
longtitude = "55.6785774231";
"place_id" = "b65e36e0-f9d9-11e0-aba9-9415ab1a8034";
};
timestamp = "2011-10-19 00:37:08";
};
},
{
Timestamps = {
"latest_update" = "2011-10-18 17:12:09";
uuid = "8c6fb842-f99b-11e0-aba9-9415ab1a8034";
};
} )and targetObject: (null)
データは 3 つのオブジェクトにマップされます。
Place、Placeinfo、LatestDBUpdate。
問題は:
上記の JSON 応答には、1 対多の関係で接続された 2 つの場所オブジェクトと 2 つのネストされた PlaceInfo オブジェクトがあります。
Timestamps キーワードに関連する LatestDBUpdate オブジェクトもあります。
Restkit は 3 つの Place オブジェクトをマップし、1 つがすべて NULL になります。他の 2 つの Place オブジェクトは正しくマッピングされており、関係も正しくなっています。もちろん、2 つの Place オブジェクトのみをマップする必要があります。
LatestDBUpdate マッピングもタイムスタンプを正しくマッピングします。
私は、JSON 応答のタイムスタンプ部分を削除すると、マッピングが正しく、2 つの場所のオブジェクトしかないと判断しました。
しかし、そこにタイムスタンプの部分が必要です! これを修正する方法がわかりません!どんなアイデアでも - 私はこれに何時間も費やしてきたので、本当にいくつかのインプットを使うことができました!
使用されるマッピング設定は次のとおりです。
//Place mapping
if (!self.placeManagedObject){
self.placeManagedObject = [RKManagedObjectMapping mappingForClass:[Place class]];
self.placeManagedObject.primaryKeyAttribute = @"UUID";
self.placeManagedObject.setDefaultValueForMissingAttributes = YES;
[self.placeManagedObject mapKeyPath:@"place_id" toAttribute:@"UUID"];
[self.placeManagedObject mapKeyPath:@"timestamp" toAttribute:@"timestamp"];
}
//PlaceInformation mapping
if (!self.placeInfoManagedObject){
self.placeInfoManagedObject = [RKManagedObjectMapping mappingForClass:[PlaceInfo class]];
self.placeInfoManagedObject.primaryKeyAttribute = @"UUID";self.placeInfoManagedObject.setDefaultValueForMissingAttributes = YES;
[placeInfoManagedObject mapKeyPath:@"place_id" toAttribute:@"UUID"];
[placeInfoManagedObject mapKeyPath:@"longtitude" toAttribute:@"longtitude"];
[placeInfoManagedObject mapKeyPath:@"latitude" toAttribute:@"latitude"];
}
//latestDBUpdate timestamp mapping
if (!self.latestDBUpdateManagedObject){
self.latestDBUpdateManagedObject = [RKManagedObjectMapping mappingForClass:[LatestDBUpdate class]];
self.latestDBUpdateManagedObject.primaryKeyAttribute = @"latest_update";
[self.latestDBUpdateManagedObject mapKeyPath:@"latest_update"toAttribute:@"latest_update"];
[self.latestDBUpdateManagedObject mapKeyPath:@"uuid" toAttribute:@"uuid"];
}
//Set mapping relations
[self.placeManagedObject mapRelationship:@"placeinfo" withMapping:self.placeInfoManagedObject];
// Register mapping with the provider -
[self.objectManager.mappingProvider setMapping:self.placeManagedObject forKeyPath:@"place"];
[self.objectManager.mappingProvider setMapping:self.placeInfoManagedObject forKeyPath:@"placeinfo"];
[self.objectManager.mappingProvider setMapping:self.latestDBUpdateManagedObject forKeyPath:@"Timestamps"];