RestKit:连接多对多关系

时间:2014-04-01 21:04:47

标签: ios objective-c core-data restkit restkit-0.20

我有以下核心数据模型是我的应用程序:

+--------------------+         +-------------+
| Ingredient         |         | Dish        |
+--------------------+         +-------------+
| id                 |         | id          |
| title              |         | title       |
| dishId (transient) |
+--------------------+         +-------------+
| dishes             | <<--->> | ingredients |
+--------------------+         +-------------+

我还有一个网络服务,它允许我请求给定菜的所有成分:

/dish/1/ingredients

(其中1是一些菜肴ID。)

对此类回复的请求如下:

{
    { "id": "1", "title": "milk" },
    { "id": "2", "title": "egg" },
    { "id": "3", "title": "flour" }
}

我已经阅读了有关RKConnectionDescription的内容,但在这种特殊情况下,我无法弄清楚如何使用它来连接这两个实体。

这是我到目前为止的映射:

RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Ingredient" inManagedObjectStore:store];

[mapping setIdentificationAttributes:@[@"id"]];

[mapping addAttributeMappingsFromDictionary:@{
        @"id" : @"id",
        @"title" : @"title",
        @"@metadata.dishId" : @"dishId"
}];

更新

我已向我的dishId实体添加了一个新的瞬态属性Ingredient,并试图像这样建立连接:

NSEntityDescription *entityDescription =
        [NSEntityDescription entityForName:@"Ingredient" inManagedObjectContext:mainContext];
NSRelationshipDescription *relationship =
        [entityDescription relationshipsByName][@"dishes"];
RKConnectionDescription *connection =
        [[RKConnectionDescription alloc] initWithRelationship:relationship attributes:@{
                @"dishId" : @"id"
        }];

[mapping addConnection:connection];

但每当我要求另一道菜的配料时,它会用新的连接替换旧的连接,所以我基本上得到一对一的关系。例如,我首先要求煎蛋卷的配料,它将煎蛋连接到鸡蛋,牛奶和面粉。然后我要求煎饼配料,它将煎饼连接到鸡蛋,牛奶和面粉上,但煎蛋卷与这些配料的连接丢失了。

<{1}}上无法使用

assignmentPolicy

1 个答案:

答案 0 :(得分:1)

您希望使用RKRoute创建请求路径并为您提供所需的关系映射(您不需要自己执行此操作)。您需要将路径的路径模式设置为/dish/:id/ingredients,以便从Dish中提取标识并注入。

使用routeWithRelationshipName:objectClass:pathPattern:method:创建路线。

使用getObjectsAtPathForRelationship:ofObject:parameters:success:failure:获取内容。

一旦连接了路由,它将执行的任何映射都将提供URL内容元数据。因此,在您的映射中使用:

@"@metadata.routing.parameters.id" : @"dishId"

请注意,dishId是您在外键映射(Ingredient)中使用的RKConnectionDescription添加的新瞬态属性。