RestKit EntityMapping 与嵌套数组

Posted

技术标签:

【中文标题】RestKit EntityMapping 与嵌套数组【英文标题】:RestKit EntityMapping with nested array 【发布时间】:2014-04-19 15:47:00 【问题描述】:

我的 JSON 响应的实体映射部分存在问题。

我尝试在我的核心数据模型中为成分创建一个单独的实体,并将 mappingForEntityName 设置为 @"Ingredients",但无济于事。在我的 Dish Core Data 实体模型中,我声明了 @"ingredientValue"、@"ingredientName" 等,但是在查看我的 .sqlite 文件时,它不会填充成分字段。

RestKit 不会向我抛出任何错误。所以我怀疑它与存储在数组中的成分有关?

如您所见,我已经声明了 2 个 RKEntityMapping 实例(我不知道这是否是正确的做法?)。但我的原料没有退回。

JSON 看起来像这样:

 dishes: [
 
    id: 34,
    name: "Pavlova med citroncreme og jordbær",
    header: "En laekker marengs kage til enhver lejlighed",
    howto: "lots of text....",
    image: "/img_path/img.jpg",
    created_at: "2014-04-05T00:25:22.378Z",
    ingredients: [
                    
                       ingredient_id: 27,
                       ingredient_amount: 3,
                       ingredient_unit: "stk",
                       ingredient_name: "æggehvider"
                     ,
                     
                       ingredient_id: 28,
                       ingredient_amount: 2,
                       ingredient_unit: "dl",
                       ingredient_name: "sukker"
                     
                 ]
    
]

Dish.h:

@interface Dish : NSManagedObject


@property (nonatomic, copy) NSString *dishName;
@property (nonatomic, copy) NSString *dishHeader;
@property (nonatomic, copy) NSString *dishImage;
@property (nonatomic, copy) NSString *dishIngredients;
@property (nonatomic) NSInteger dishID;
@property (nonatomic, copy) NSData *dishMainText;
@property (nonatomic) NSDate *createdAt;

//Ingredients
@property (nonatomic, copy) NSString *ingredientName;
@property (nonatomic, copy) NSString *ingredientUnit;
@property (nonatomic) NSInteger ingredientValue;
@property (nonatomic) NSInteger ingredientID;
@end

菜.m:

RKEntityMapping *dishMapping = [RKEntityMapping mappingForEntityForName:@"Dish" inManagedObjectStore:managedObjectStore];
    [dishMapping addAttributeMappingsFromDictionary:@
                                                    @"id":          @"dishID",
                                                    @"name":        @"dishName",
                                                    @"header":      @"dishHeader",
                                                    @"howto":       @"dishMainText",
                                                    @"image":       @"dishImage",
                                                    @"created_at":   @"createdAt"];


    dishMapping.identificationAttributes = @[ @"dishID" ];

    RKEntityMapping *ingredientMapping = [RKEntityMapping mappingForEntityForName:@"Dish" inManagedObjectStore:managedObjectStore];
    [ingredientMapping addAttributeMappingsFromDictionary:@
                                                    @"ingredient_amount": @"ingredientValue",
                                                    @"ingredient_unit": @"ingredientUnit",
                                                    @"ingredient_name": @"ingredientName"];

    [dishMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"dishes" toKeyPath:@"dishes" withMapping:ingredientMapping]];


    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:dishMapping
                                                                                            method:RKRequestMethodGET
                                                                                       pathPattern:@"/dishes.json"
                                                                                           keyPath:@"dishes"
                                                                                       statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

EDITRKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace)添加了部分日志输出

with mapping <RKEntityMapping:0x8f69750 objectClass=NSManagedObject propertyMappings=(
    "<RKAttributeMapping: 0x8f6c150 name => dishName>",
    "<RKAttributeMapping: 0x8f6c190 id => dishID>",
    "<RKAttributeMapping: 0x8f6c480 header => dishHeader>",
    "<RKAttributeMapping: 0x8f6c4a0 howto => dishMainText>",
    "<RKAttributeMapping: 0x8f6c520 image => dishImage>",
    "<RKAttributeMapping: 0x8f6c5c0 created_at => createdAt>",
    "<RKRelationshipMapping: 0x8f6d8e0 dishes => dishes>"

【问题讨论】:

【参考方案1】:

我没有看到您的 Dish 实体中定义了 dishes。它应该是与Ingredient 的一对多关系。

ingredientMapping 应该使用Ingredient 实体。

在您调用dishMapping addPropertyMapping:... 的地方,您应该使用...FromKeyPath:@"ingredients" ... 来匹配传入的JSON 中的键名。

【讨论】:

如果这是一个愚蠢的问题,我很抱歉,但我是 RestKit 和整个 entityMapping 的新手。但我为什么要在我的实体中定义菜肴?我以为我只需要在我的 JSON 提要中指定我需要从我的菜肴对象中提取的项目? 并且由于某种原因,当我将实体更改为 Ingredients 时,ingredientMapping 出现以下错误 the entity Dish is not key value coding-compliant for the key "dishes".' 我想这可能与您所说的定义 dishes 有关在 Dish 实体中? 您使用的是addPropertyMapping:[RKRelationshipMapping,因此您需要与数据模型(以及您的托管对象子类)中的关系对应 是的,已连接。您需要修复列出的所有项目(可能还有一些我目前无法高大的其他事情是错误的;-)) 我的话......它奏效了。虽然解释为什么会很棒:) 我将dishes 作为字符串值添加到我的 Dish 实体中,ingredients 实体现在已正确填充。但我必须承认我真的不明白发生了什么。你能详细说明一下吗?我如何将两个实体的 has_many 关系联系在一起?感谢您迄今为止的帮助 - 克里斯

以上是关于RestKit EntityMapping 与嵌套数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用RestKit像这样从json添加属性映射?

NSDictionary 中的嵌套对象与 RestKit

RestKit .22:无法成功映射与嵌套 JSON 的关系

RestKit - 发布或放置包含嵌套实体的实体

RestKit 将未嵌套关系映射到拥有对象

RestKit嵌套的一对多关系映射很慢