3

我正在开发我的第一个使用 RestKit 0.2 和 Core Data 的 iOS 应用程序。大多数时候我都遵循这个很棒的教程http://www.alexedge.co.uk/blog/2013/03/08/introduction-restkit-0-20/ 但是它不符合我的要求,因为它描述了嵌入式JSON 对象,我需要创建单独的对象。这是我的应用程序结构的简化方案:

JSON响应:

"application": [
    {
        "appId": "148",
        "appName": …
.
.
.
(more attributes)
    }
],
"image": [
    {
        "imgId": "308",
        "appId": "148",
        "iType": "screenshot",
        "iPath": ..
.
.
.
    },
    {
        "imgId": "307",
        "appId": "148",
        "iType": "logo",
        "iPath": …
.
.
.
    }
]

我创建了一个包含两个实体的数据模型,并以一个应用程序可能有多个图像而一个图像可能只属于一个应用程序的方式设置它们之间的关系:

在此处输入图像描述

我使用 mogenerator 创建由实体表示的类。

我可以使用以下代码成功地将实体映射到 Application 对象:

NSDictionary *parentObjectMapping = @{
                                      @"appId" : @"appId"
                                      };


// Map the Application object
RKEntityMapping *applicationMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Application class]) inManagedObjectStore:managedObjectStore];
applicationMapping.identificationAttributes = @[ @"appId" ];
[applicationMapping addAttributeMappingsFromDictionary:@{
 @"appName" : @"name",
 @"appCat" : @"category",
 @"appType" : @"type",
 @"compName" : @"companyName",
 @"compWeb" : @"companyWebsite",
 @"dLink" : @"downloadWebLink",
 @"packageName" : @"appStoreLink",
 @"osMinVer" : @"minRequirements",
 @"appCost" : @"cost",
 @"appDescription" : @"appDescription"
 }];

[applicationMapping addAttributeMappingsFromDictionary:parentObjectMapping];

 // Register our mappings with the provider
 [manager addResponseDescriptorsFromArray:@[

 [RKResponseDescriptor responseDescriptorWithMapping:applicationMapping
 pathPattern:nil
 keyPath:@"application"
 statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]
 ]];

现在我在将 JSON 映射到具有 Image 和 Application 之间适当关系的图像对象时遇到问题。如何添加两个实体之间的映射?我的数据模型是正确的还是我遗漏了什么?

4

2 回答 2

5

您想使用外键映射来允许 RestKit 连接对象。

您需要添加一个图像映射,它应该有一个属性来保存appId. 然后,需要添加连接关系:

[imageMapping addConnectionForRelationship:@"application" connectedBy:@{ @"appId": @"appId" }];

这告诉 RestKit 使用appId图像实例上的属性来连接到具有对应关系的应用程序实例appId并将结果保存在application关系中。

于 2013-07-01T19:21:29.633 回答
1

我假设您不能更改“图像” JSON 对象的数据结构,因此这将限制 RestKit 的功能,就自动关系映射而言。但是,您仍然可以自己建立关系。

首先,您需要在数据模型中添加一个字段appId.

然后,设置您的图像映射,如下所示:

RKEntityMapping* imageMapping = [RKEntityMapping mappingForEntityForName:@"Image" inManagedObjectStore:objectManager.managedObjectStore];
[imageMapping addAttributeMappingsFromDictionary:@{
 @"imgId" : @"imageId",
 @"iPath" : @"clientPath",
 @"iType" : @"type",
 @"sPath" : @"serverPath",
 @"appId" : @"appId"
 }];
imageMapping.identificationAttributes = @[ @"imageId" ];
RKResponseDescriptor *imageResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:imageMapping pathPattern:nil keyPath:@"image" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:imageResponseDescriptor];

在此之后,您的映射应该完成。要使用您的对象填充本地数据库,请进行以下调用getObjectsAtPath

[[RKObjectManager sharedManager] getObjectsAtPath:@"/yourWebServiceURL" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    // success block
    NSLog(@"Success!");
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    //fail block
}];

这应该将所有对象加载到 CoreData 中。在您的应用程序的另一个地方,甚至可能在上述调用的成功块中,您需要将您的 Image 对象连接到您的 Application 对象。您需要获取请求和for循环。只需将每个Image的“应用程序”属性分配为Application具有相同的对象appId,如下所示:

myImage.application = fetchedApplicationWithID;

然后,您将能够以两种方式查找关系,with[myImage application]和 with [myApplication images]

于 2013-07-01T19:29:35.610 回答