RestKit - Objectmapping!Что здесь не так? - PullRequest
1 голос
/ 19 октября 2011

У меня есть ответ 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 есть 2 объекта place и 2 вложенных объекта PlaceInfo, связанных отношением One To Many.

Существует также объект LatestDBUpdate, который относится к ключевому слову Timestamps.

Restkit отобразит 3 объекта Place, и один из них будет NULL. Два других объекта Place отображаются правильно, и отношения также правильны. Это должно, конечно, только карта 2 Поместите объекты!

Функция отображения новейших DBUpdate также правильно отображает временные метки.

Я определил, что если я удалю часть меток времени из отклика JSON, то отображение будет правильным, только с двумя объектами размещения.

Но мне нужна часть Timestamps, чтобы быть там! Я понятия не имею, как это исправить! любые идеи - я мог бы действительно использовать некоторые входные данные, так как я использовал часы на часы на этом!

Вот используемые настройки отображения:

//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"]; 

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Вернемся с ответом на мою собственную проблему ... Кажется, здесь не так много участников, которые используют 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"; 
    }; 
};} 

Добавление вида первичного ключа для мест -> 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 делает такой большой Разница в отображении.!

0 голосов
/ 24 февраля 2012

Во-первых, было бы более полезно, если бы вы задали действительный 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"
    }
}
...