Получение «этот класс не совместим со значением ключа для идентификатора ключа». при запросе RestKit loadObjectsAtResourcePath - PullRequest
1 голос
/ 15 января 2012

Я пытаюсь десериализовать данные JSON в приложение для iPhone с помощью RKObjectManager RestKit.

Моя текущая проблема - приложение вылетает с:

*** 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 ]

7 голосов
/ 15 апреля 2013

Я получил ту же ошибку, хотя моя проблема была в том, что я просто забыл удалить директиву @dynamic с @synthesize, чтобы поменять мой тест на использование CoreData.


5 голосов
/ 16 июля 2012

Это может помочь другим, но у меня была эта проблема, и причина была в том, что я использовал NSInteger в своем определении объекта. RestKit не может отображаться на NSInteger, только NSNumber .

3 голосов
/ 19 июля 2012

Я публикую это как альтернативный ответ. Ответы пока полностью верны. Есть еще одна перестановка, которая заняла у меня некоторое время, чтобы найти. Симулятор мог кэшировать ресурс пакета для программы. Если этот ресурс пакета устарел, вы можете получить конфликт. Самое простое решение: «удалить» приложение из симулятора (и, возможно, другие приложения, которые могут иметь одноименный пакет). Как только я это сделал, я сразу обнаружил реальную проблему, так как неправильно подключил свой пакет к родительскому проекту из проекта SDK.

1 голос
/ 14 октября 2013

Этот, вероятно, кажется очевидным, но я получил его за два дня ...

Убедитесь, что все классы в ваших RKObjectMappings верны! Это была небольшая опечатка, когда я использовал родительский класс для отображения вложенного элемента, в строке кода, на которую я никогда не смотрел, потому что предполагал, что это определенно правильно, и это приводило к краху.

1 голос
/ 20 января 2012

Возможно, стоит проверить, верен ли JSON, который вы получили, и в формате (ключи / типы значений), вы ожидаете - у меня была точно такая же проблема с RESTKit до

Я использую 'JSON Validator'&' Visual JSON ', оба бесплатны в Mac App Store

В качестве альтернативы убедитесь, что ваша сущность CoreData допускает сопоставления для многих для курсов

0 голосов
/ 03 июля 2015

В принятом ответе говорится, что RestKit не может отображаться на NSInteger, что, как я обнаружил, не совсем верно, потому что я недавно столкнулся с той же проблемой и решил ее, просто удалив * из свойства NSInteger.

Я использую @property(nonatomic) NSInteger id; вместо @property(nonatomic) NSInteger *id;

0 голосов
/ 27 декабря 2014

К сожалению, эта ошибка может возникать из-за ряда проблем, связанных с атрибутом или связями mappings.

Это включает опечатки в любом из ваших имен атрибутов.

Помните, что отображение атрибута или отношения неверно, если оно не соответствует вашему API . Например, я просто столкнулся с этой ошибкой из-за чего-то вроде следующего:

Каждая модель Restaurant имеет отношение внешнего ключа к модели Location.

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

Но используемый мной API возвращает что-то вроде следующих данных JSON для Restaurant объекта:

{
    "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, но это несоответствие ожиданий может привести к такому типу ошибки.

...