0

JSON データのlatest_updateフィールドのマッピングに問題があります。

Web サービスからこの JSON データを受け取る:

{"Places":[ 
    {"place_ID": "7cceedda-ed3a-11e0-a1a8-858e3974979a", 
     "timestamp": "2011-10-02 23:24:42" 
    }, 
    {"place_ID": "7cceedda-ed3a-11e0-a1a8-858e3974933x", 
     "timestamp": "2011-10-02 23:24:42" 
    }, 
    {"latest_update":"2011-10-13 12:16:17"}] 

}

管理されたマッピングに使用するコードの抜粋:

 //Place mapping 
    if (!self.placeManagedObject){ 
        self.placeManagedObject = [RKManagedObjectMapping 
mappingForClass:[Place class]]; 
        self.placeManagedObject.primaryKeyAttribute = @"UUID"; 
        self.placeManagedObject.rootKeyPath = @"places"; 
        [self.placeManagedObject mapKeyPath:@"place_ID" 
toAttribute:@"UUID"]; 
        [self.placeManagedObject mapKeyPath:@"timestamp" 
toAttribute:@"timestamp"]; 
        [self.placeManagedObject mapRelationship:@"PlaceInformation" 
withMapping:self.placeInfoManagedObject]; 
        // Register mapping with the provider - means it will look for 
places in the JSON input 
        [objectManager.mappingProvider 
setMapping:self.placeManagedObject forKeyPath:@"places"]; 
    } 
    //latestDBUpdate timestamp mapping 
    if (!self.latestDBUpdateManagedObject){ 
        self.latestDBUpdateManagedObject = [RKManagedObjectMapping 
mappingForClass:[LatestDBUpdate class]]; 
        self.latestDBUpdateManagedObject.primaryKeyAttribute = 
@"latest_update"; 
        self.latestDBUpdateManagedObject.rootKeyPath = @"places"; 
        [self.latestDBUpdateManagedObject mapKeyPath:@"latest_update" 
toAttribute:@"latest_update"]; 
        // Register mapping with the provider - means it will look for 
places in the JSON input 
        [objectManager.mappingProvider 
setMapping:self.latestDBUpdateManagedObject 
forKeyPath:@"latest_update"]; 
    } 

RestKit は Place オブジェクトを正しくマップします: {"place_ID": "7cceedda-ed3a-11e0-a1a8-858e3974979a", "timestamp": "2011-10-02 23:24:42" } ... Place オブジェクトに、しかし、latest_updateはLatestDBUpdate クラスオブジェクトにマップされていないため、 動作させることはできません。

何時間も検索して試しても解決策に近づかなかったので、誰かがそれがどのように行われたかについての答えを持っていることを願っています. ありがとうトーマス

4

1 に答える 1

2

だから私はついにそれを理解しました。基本的にいくつかの小さな調整と、私に代わっていくつかのエラーがあります:-/

そこで、JSON出力をWebサービスから次の形式に変更しました。

{"Places":[ 
{"place_ID": "7cceedda-ed3a-11e0-a1a8-858e3974979a", 
 "timestamp": "2011-10-02 23:24:42" 
}, 
{"place_ID": "7cceedda-ed3a-11e0-a1a8-858e3974933x", 
 "timestamp": "2011-10-02 23:24:42" 
}], 
"Timestamps":[
{"latest_update":"2011-10-13 12:16:17"}]

タイムスタンプ->latest_updateのマッピングでエラーが発生したため、次のように修正しました。

//latestDBUpdate timestamp mapping
if (!self.latestDBUpdateManagedObject){
    self.latestDBUpdateManagedObject = [RKManagedObjectMapping mappingForClass:[LatestDBUpdate class]];
    self.latestDBUpdateManagedObject.primaryKeyAttribute = @"latest_update";
    self.latestDBUpdateManagedObject.rootKeyPath = @"Timestamps";
    [self.latestDBUpdateManagedObject mapKeyPath:@"latest_update" toAttribute:@"latest_update"];

    // Register mapping with the provider - means it will look for the keyword Timestamps in the JSON input
    [self.objectManager.mappingProvider setMapping:self.latestDBUpdateManagedObject forKeyPath:@"Timestamps"];

そして、getメソッドで大きなエラーが発生しました。基本的に、RestKitに、応答はプレイスマッピングによってのみマッピングする必要があるため、JSON入力内の他のすべてのデータで他のキーワードをチェックしないように指示しました。違いを示すために、使用した両方のGETメソッドを示します。1つ目は、指定されたマッピングスキームでのみマップし、2つ目は、登録されているすべてのマッピングスキームでチェックします。

GETメソッド番号1:(上記のコンテキストでは機能しません!)

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:gPlaceListBaseUrl objectMapping:self.placeManagedObject delegate:self];

GETメソッド番号2:(ここでは、すべてのマッピングスキームがチェックされ、両方のPlaceオブジェクトと、LatestDBUpdateオブジェクトがマッピングされます!)

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:gPlaceListBaseUrl delegate:self];

うまくいけば、誰かがいつかこれを必要とするかもしれません:-D

トーマス

于 2011-10-18T13:45:10.467 に答える