获得“这个类不符合关键值的关键值编码。”请求RestKit loadObjectsAtResourcePath时

时间:2012-01-15 16:50:14

标签: objective-c ios5 xcode4.2 restkit

我正在尝试使用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];

关于这个的任何想法?

7 个答案:

答案 0 :(得分:7)

我遇到了同样的错误,虽然我的问题是忘记在使用CoreData更改测试时使用@synthesize删除@dynamic指令。


答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

可能值得检查你的回归有效的JSON&amp;在格式(键/值类型)中,您期望 - 我之前在RESTKit中遇到过完全相同的问题

我使用&#39; JSON Validator&#39; &安培; &#39; Visual JSON&#39;,两者都在Mac App Store上免费

或者,请确保您的CoreData实体允许课程 映射

答案 4 :(得分:1)

这个似乎很明显,但它让我有两天......

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

答案 5 :(得分:0)

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

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

请注意,除非与您的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正在寻找完整的响应,如下所示:

{
    "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响应,但是期望的不匹配可能会导致这种类型的错误。

答案 6 :(得分:0)

RestKit无法映射到NSInteger的已接受答案状态,我发现它并不完全正确,因为我最近遇到了同样的问题,只是通过移除{{1}的*来解决它} property。

我使用NSInteger代替@property(nonatomic) NSInteger id;