RestKit - Сопоставление объектов!Что здесь происходит не так?
-
27-10-2019 - |
Вопрос
У меня есть ответ в формате 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 объектами:
Разместить, Placeinfo и LatestDBUpdate.
Проблема в том, что:
В приведенном выше ответе JSON есть 2 объекта place и 2 вложенных объекта PlaceInfo, связанных отношением "Один ко многим".
Существует также объект LatestDBUpdate, который относится к ключевому слову Timestamps.
Restkit сопоставит 3 объекта Place, и все они будут НУЛЕВЫМИ.2 других объекта Размещения нанесены на карту правильно, и отношения также правильные.Конечно, он должен отображать только 2 объекта размещения!
Отображение LatestDBUpdate также корректно отображает временные метки.
Я определил, что если я удалю часть временных меток в JSON respons, то сопоставление будет правильным, только с 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"];
Решение
Возвращаюсь снова, с ответом на мою собственную проблему...Кажется, здесь не так много участников, которые используют Restkit!
Мое решение, возможно, не очень красивое, но единственное, которое сработало, без удаления временных меток в ответе JSON:
Я изменил ответ JSON следующим образом:
{
placeList = (
{
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";
};
}
);
updateData = {
timestamps = {
"latest_update" = "2011-10-18 17:12:09";
uuid = "8c6fb842-f99b-11e0-aba9-9415ab1a8034";
};
};}
Добавление своего рода первичного ключа для places -> placeList и updateData для временных меток.
Мне также нужно было изменить ключевой путь для поставщика, чтобы отразить изменение входных данных JSON:
// Register mapping with the provider -
[self.objectManager.mappingProvider setMapping:self.placeManagedObject forKeyPath:@"placeList.place"];
[self.objectManager.mappingProvider setMapping:self.placeInfoManagedObject forKeyPath:@"placeinfo"];
[self.objectManager.mappingProvider setMapping:self.latestDBUpdateManagedObject forKeyPath:@"updateData.timestamps"];
Так что это решило проблему.Нет более объектами null, отображается, даже если я не вполне понимаю, почему изменение формата JSON делает такой большой разница в отображении.!
Другие советы
Во -первых, было бы более полезно, если бы вы разместили действительный JSON, когда задаете такой вопрос - вы, вероятно, получите больше ответов.
Во -вторых, основной проблемой в вашей первой попытке является группировка Timestamps
объект как часть sourceObject
множество. Вы, скорее всего, получили бы то, что хотите, вместо этого:
{
"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"
}
}