【问题标题】:Getting "this class is not key value coding-compliant for the key id." when requesting RestKit loadObjectsAtResourcePath获取“此类不符合键 ID 的键值编码”。当请求 RestKit loadObjectsAtResourcePath
【发布时间】:2012-02-10 21:20:49
【问题描述】:

我正在尝试使用 RestKit 的 RKObjectManager 将 JSON 数据反序列化到我的 iPhone 应用程序中。

我当前的问题是应用程序崩溃并显示:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Course 0x6e71b10> valueForUndefinedKey:]: this class is not key value coding-compliant for the key id.'

当我打电话时:

[manager loadObjectsAtResourcePath:@"/courses" delegate:nil];

我的域类 - Course.h 看起来像

#import <Foundation/Foundation.h>



@interface Course : NSObject  {

}

@property(nonatomic) NSInteger *id;

@property(nonatomic, retain) NSString *name;

-(id)initWithIdAndName: (NSInteger *)inId inName:(NSString *)inName;
@end

Course.m 看起来像

#import "Course.h"
#import "NSDictionary+RKAdditions.h"


@implementation Course {

}
@synthesize name = _name;
@synthesize id = _id;

- (id)initWithIdAndName:(NSInteger *)inId inName:(NSString *)inName {
    _name = inName;
    _id = inId;
    return self;

}

#pragma mark NSCoding Protocol


- (void)encodeWithCoder:(NSCoder *)encoder;
{
[encoder encodeInteger:[self id] forKey:@"id"];
[encoder encodeObject:[self name] forKey:@"name"];
}

- (id)initWithCoder:(NSCoder *)decoder;
{
if ( ![super init] )
    return nil;

[self setId:[decoder decodeIntForKey:@"id"]];
[self setName:[decoder decodeObjectForKey:@"name"]];


return self;
}

@end 

从服务器获取的Json数据是

{"courses":[{"id":1,"name":"course 1"},{"id":2,"name":"course 2"}]}

使用以下代码调用 RKObjectManager:

RKObjectMapping* courseMapping = [RKObjectMapping mappingForClass:[Course class]];
[courseMapping mapKeyPath:@"id" toAttribute:@"id"];
[courseMapping mapKeyPath:@"name" toAttribute:@"name"];


RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL:@"http://firstbit/of/url"];

[manager.mappingProvider setMapping:courseMapping forKeyPath:@"courses"];
[manager loadObjectsAtResourcePath:@"/endpoint" delegate:nil];

关于这个有什么想法吗?

【问题讨论】:

  • 也许您可以尝试将 id 属性更改为 courseId 之类的内容,以避免可能的命名冲突。
  • 我不认为这是问题所在,但应该是 NSInteger 而不是 NSInteger * 无论如何:stackoverflow.com/questions/1014053/…

标签: objective-c ios5 xcode4.2 restkit


【解决方案1】:

RestKit 无法映射到 NSInteger 的公认答案状态,我发现这并不完全正确,因为我最近遇到了同样的问题,只是通过删除 NSInteger 属性的 * 来解决它。

我使用@property(nonatomic) NSInteger id; 而不是@property(nonatomic) NSInteger *id;

【讨论】:

    【解决方案2】:

    不幸的是,由于许多与属性或关系映射有关的问题,可能会出现此错误。

    这包括您的任何属性名称中的拼写错误。

    请记住,一个属性或关系映射是不正确的,除非它与您的 API 保持一致。例如,我刚刚遇到了这个错误,原因如下:

    每个Restaurant 模型与Location 模型都有一个外键关系。

    [restaurantMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"location" toKeyPath:@"location" withMapping:locationMapping]];
    

    但我使用的 API 会为 Restaurant 对象返回类似于以下 JSON 数据的内容:

    {
        "id": 42,
        "resource_uri": "http://example.com/api/v1/restaurants/42",
        "location": "http://example.com/api/v1/locations/987"
    }
    

    RestKit 正在寻找 full 响应,如下所示:

    {
        "id": 42,
        "resource_uri": "http://example.com/api/v1/restaurants/42",
        "location": {
            "id": 987,
            "resource_uri": "http://example.com/api/v1/locations/987"
        }
    }
    

    注意不同的location 值。

    我想您也可以更改 RestKit 以处理以前的 API 响应,但预期不匹配可能会导致此类错误。

    【讨论】:

      【解决方案3】:

      这个可能看起来很明显,但它让我花了两天时间......

      确保你的 RKObjectMappings 中的所有类都是正确的!这是我使用父类进行嵌套元素映射的一个小错字,在我从未看过的代码行中,因为我认为它绝对正确,并且它使整个事情崩溃。

      【讨论】:

        【解决方案4】:

        我遇到了同样的错误,尽管我的问题只是忘记使用 @synthesize 删除 @dynamic 指令,以便将我的测试更改为使用 CoreData。


        【讨论】:

        • 感谢您发表此评论,我也从核心数据模型转到仅使用对象映射,但忘记将属性切换回 @synthesize。
        【解决方案5】:

        我将此作为替代答案发布。到目前为止的答案是完全正确的。还有一个排列让我花了一段时间才找到。模拟器可能已经为程序缓存了捆绑资源。如果此捆绑资源已过期,您可能会遇到冲突。最简单的解决方案:从模拟器中“卸载”应用程序(以及可能具有相同名称包的其他应用程序)。一旦我这样做了,我立即发现了真正的问题,因为我没有正确地将我的包附加到父项目形成一个 sdk 项目。

        【讨论】:

          【解决方案6】:

          它可能对其他人有所帮助,但我遇到了这个问题,原因是我在对象定义中使用了 NSInteger。 RestKit cannot map to NSInteger, only NSNumber.

          【讨论】:

          • 你确定他们没有以某种方式解决这个问题吗?我在当前项目的许多地方都成功地映射到了 NSIntegers。
          • @Kyle 我同意 Alexander,我认为 RestKit 不支持映射到原始类型。因此,例如必须将 JSON 布尔值映射到 NSNumber *
          【解决方案7】:

          可能值得检查您返回的 JSON 是否有效且格式(键/值类型),如您所料 - 我之前在 RESTKit 上遇到过同样的问题

          我使用“JSON Validator”和“Visual JSON”,两者都在 Mac App Store 上免费

          或者,确保您的 CoreData 实体允许 to-many 映射 courses

          【讨论】:

          • 是的,Visual JSON 非常棒!在嵌套的 JSON 中,人们很快就会走上错误的道路——树状视图有助于让事情变得正确。
          猜你喜欢
          • 2014-05-13
          • 1970-01-01
          • 1970-01-01
          • 2017-10-24
          • 2017-10-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多