2

RestKit 0.10.1を使用して、次のjson形式と同様のオブジェクトを提供しています。

{"objects": [
    {"owner": 1, 
     "_id": 823, 
     "data": {
         "diam": 5.0, 
         "plant_date": "10/02/2008"}
    }, 
     ...   ] }

クライアント側では、サブオブジェクトやリレーションシップは必要ないので、オブジェクトの属性にフラット化します。

[myMapping mapKeyPathsToAttibutes: 
    @"_id", @"id", 
    @"owner", @"owner", 
    @"data.diam", @"diam", //here is what I mean by flatten; notice data.diam -> diam
    @"data.plant_date", @"plant_date", nil];

このデータの読み取りに問題はありませんが、シリアル化する場合は、最上位の属性のみがサーバーに送信されます。シリアル化すると、サーバーは次のようになります。

{"_id":0,"owner":1}

上記のinverseMappingを使用してシリアル化マッピングを正しく(私は思う)登録したことに注意してください。

[objectManager.mappingProvider setSerializationMapping:[myMapping inverseMapping] forClass:[MyClass class]];

私がそのようにオブジェクトを投稿するとき:

myObject = [MyClass object];
myObject.diam = [NSNumber numberWithInt:5];
myObject.plant_date = myDate;

[[RKObjectManager sharedManager] postObject:myObject delegate:self];

完全な、平坦化されていない構造が必要です。

{"_id":0,"owner":1, "data": {"diam": 5.0, "plant_date": "10/02/2008"} }

RestKitを使用して、登録済みオブジェクトをサーバーにマッピングするキーパス(つまり、「data.diam」)を投稿するにはどうすればよいですか?

4

2 に答える 2

3

これはRestKitのバグのようです。次のスニペットで再現できます。

RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);

NSDictionary* src = [NSDictionary dictionaryWithObjectsAndKeys: @"cat", @"animal", nil];
NSMutableDictionary* dst = [NSMutableDictionary dictionary];

RKObjectMapping* mapping = [RKObjectMapping mappingForClass: [NSDictionary class]];
[mapping mapKeyPath: @"type.animal" toAttribute: @"animal"];

RKObjectMappingOperation* op = [[RKObjectMappingOperation alloc] initWithSourceObject: src
                                                                    destinationObject: dst 
                                                                              mapping: [mapping inverseMapping]];

NSError* error = nil;
[op performMapping: &error];

ログを見ると、次の行が表示されます。

restkit.object_mapping:RKObjectMappingOperation.m:258宛先オブジェクト{}はkeyPathtype.animalの属性値catを拒否しました。スキップしています...

失敗するメソッドは-validateValue:forKeyPath:error:です。これは、リレーションシップコンポーネントが存在しないためです。RestKitgithubでバグ/問題レポートを開くことをお勧めします。

于 2012-07-16T07:04:58.923 に答える
2

このバグは、0.20でリリースされる開発のRestKitで修正されていることに注意してください。チェンジセット@https://github.com/RestKit/RestKit/commit/64e9c7cb6d04dd8750e9f663fc998bbe738945e9を参照してください

于 2012-10-16T02:01:41.050 に答える