2

私は次のJSONを持っています:

{
    "users": [
        {"id": "1", "name": "John Doe"},
        {"id": "2", "name": "Bill Nye"}
    ],
    "groups": [
        {"id": "1", "name": "Group1", "users": ["1", "2"]},
        {"id": "2", "name": "Group2", "users": ["1"]}
    ]
}

...ユーザーオブジェクトとグループオブジェクトを含むコアデータモデル。グループオブジェクトには、ユーザーとの多対関係(NSSet)があります。

これが可能であることを示しているように見えるが、そのようなマッピングがどのように実行されるかについての説明が含まれていない次のスレッドを見つけました。

https://github.com/RestKit/RestKit/issues/284

各グループの「ユーザー」関係が適切に接続されるように、このマッピングを実行するにはどうすればよいですか?

注: JSONユーザーとグループをそれぞれのCoreDataオブジェクトに正しくマッピングするマッピングを設定しています。ただし、各グループの「ユーザー」NSSetは空です。

4

2 に答える 2

3

そこで、RestKit 0.20(pre2)を使用してこれを理解しました。

JSONを次のように変更する必要がありました(グループのusers配列の属性名に注意してください)。

{
    "users": [
        {"id": "1", "name": "John Doe"},
        {"id": "2", "name": "Bill Nye"}
    ],
    "groups": [
        {"id": "1", "name": "Group1", "users": [{"id" : "1"}, {"id" : "2"}]},
        {"id": "2", "name": "Group2", "users": [{"id" : "1"}]}
    ]
}

次に、次のマッピング:

RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:managedObjectStore];
userMapping.identificationAttributes = @[@"id"];
[userMapping addAttributeMappingsFromArray:@[@"id", @"name"]];
RKEntityMapping *groupMapping = [RKEntityMapping mappingForEntityForName:@"Group" inManagedObjectStore:managedObjectStore];
groupMapping.identificationAttributes = @[@"id"];
[groupMapping addAttributeMappingsFromArray:@[@"id", @"name"]];
[groupMapping addRelationshipMappingWithSourceKeyPath:@"users" mapping:userMapping];

そして最後に、次のresponseDescriptors:

RKResponseDescriptor *userResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:classMapping pathPattern:@"/api/allthejson" keyPath:@"users" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
RKResponseDescriptor *groupResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:classMapping pathPattern:@"/api/allthejson" keyPath:@"groups" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptorsArray:@[userResponseDescriptor, groupResponseDescriptor]];

次に、RKObjectManagerのgetObjectsAtPath:parameters:success:failureメソッドを使用してオブジェクトを取得します。

于 2012-12-06T19:22:44.563 に答える
1

RestKitには、特にモデリング関係に関して多くの問題があります。マッピングのデバッグは困難な場合があります。

これは、RestKitなしで記述した内容を処理するコードです。

NSArray *userArray; 
// an array populated with NSManagedObjects 
// correctly converted from JSON to the User entity

NSArray *groups = [jsonObject objectForKey:@"groups"];

for (NSDictionary *d in groups) {
   Group *g = [NSEntityDescription insertNewObjectForEntityForName:@"Group"
                  inManagedObjectContext:_managedObjectContext];
   g.id = @([d[@"id"] intValue]);
   g.name = d[@"name"];
   NSArray *users = d[@"users"];
   for (NSString *s in users) {
      User *u = [[userArray filteredArrayUsingPredicate:
        [NSPredicate predicateWithFormat:@"id = %@", @([s intValue])]]
          objectAtIndex:0];
      [g addUsersObject:u];
   }
}
// save
于 2012-12-05T16:58:34.527 に答える