RestKit 0.20.1 映射本地 JSON “此类不符合键值编码...”

Posted

技术标签:

【中文标题】RestKit 0.20.1 映射本地 JSON “此类不符合键值编码...”【英文标题】:RestKit 0.20.1 mapping local JSON "this class is not key value coding-compliant for the key..." 【发布时间】:2013-05-27 00:00:28 【问题描述】:

嗨,我正在使用 RestKit 来映射我已经收到(我已经验证正在发生)的本地 JSON 数据(Twitter 提要),并且在进行映射时遇到了问题。我收到的错误是:

2013-05-26 17:23:57.541 FoodTrucks[25932:c07] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSEntityDescription 0x7663950> valueForUndefinedKey:]: this class is not key value coding-compliant for the key tweet.'

从my log (Gist) 看来,它似乎正在从我的 JSON 中找到可映射的值(我打开了 RestKit 的 ObjectMapping 和 CoreData 日志记录)。我在网上看了一堆试图找出它为什么会收到这个错误,但似乎找不到任何适用于我的情况的东西。这就是我执行映射的方式:

-(void)performMapping

    RKEntityMapping *mapping = [ObjectMappings FoodTruckArticleMapping];
    RKManagedObjectStore *store = [[FoodTruckDataModel sharedDataModel] objectStore];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"FoodTruck" inManagedObjectContext:store.mainQueueManagedObjectContext];
    RKManagedObjectMappingOperationDataSource *mappingDS = [[RKManagedObjectMappingOperationDataSource alloc] initWithManagedObjectContext:store.mainQueueManagedObjectContext cache:store.managedObjectCache];
    mappingDS.operationQueue = [NSOperationQueue new];
    RKMappingOperation *operation = [[RKMappingOperation alloc] initWithSourceObject:self.moreStatuses destinationObject:entity mapping:mapping];
    operation.dataSource = mappingDS;
    NSError *error = nil;
    [operation performMapping:&error];
    [mappingDS.operationQueue waitUntilAllOperationsAreFinished];

我也不确定这个执行映射的类是否需要特别继承任何东西,和/或是否需要采用RKMappingOperationDelegate。现在,它只是继承自 NSObject。这是我的映射类的外观:

ObjectMappings.h:

@interface ObjectMappings : RKEntityMapping

+(RKEntityMapping *)FoodTruckArticleMapping;

@end

ObjectMappings.m:

@implementation ObjectMappings

+(RKEntityMapping *)FoodTruckArticleMapping

    RKEntityMapping *jsonMapping = [RKEntityMapping mappingForEntityForName:@"FoodTruck" inManagedObjectStore:[[FoodTruckDataModel sharedDataModel] objectStore]];
    jsonMapping.identificationAttributes = @[@"tweetID"];

    [jsonMapping addAttributeMappingsFromDictionary:@
 @"text": @"tweet", @"user.screen_name": @"foodTruckName", @"id_str": @"tweetID", @"created_at": @"timeStamp"];

    return jsonMapping;


@end

我的对象类是一个NSManagedObject,其中包含所有@dynamic 方法实现。任何帮助将不胜感激!

编辑:

NSManagedObject 类,FoodTruck.h:

@interface FoodTruck : NSManagedObject

@property (nonatomic, retain) NSString *foodTruckName;
@property (nonatomic, retain) NSString *tweet;
@property (nonatomic, retain) NSDate *timeStamp;
@property (nonatomic, retain) NSString *tweetID;

@end

FoodTruck.m

@implementation FoodTruck

@dynamic foodTruckName;
@dynamic tweet;
@dynamic timeStamp;
@dynamic tweetID;

@end

【问题讨论】:

你能显示NSManagedObject子类吗? @Gabriele:请参阅上面的编辑。 你是如何创建目标对象 foodTruck 的? @Wain- 抱歉,我实际上有一段错误的代码。现在已更正并显示为RKMappingOperation *operation = [[RKMappingOperation alloc] initWithSourceObject:self.moreStatuses destinationObject:entity mapping:mapping];。我的目标对象是我的Food Truck 实体,正如我相信您在我之前的帖子中所说的那样。谢谢! 【参考方案1】:

我最终发现了我的问题——我的错误是没有创建一个用我的实体初始化的 NSManagedObject 的新实例:

-(void)performMapping

NSManagedObject *newManagedObject = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:store.persistentStoreManagedObjectContext];

NSManagedObject 然后成为 RKMappingOperation 中的目标对象,而不是我的实体,就像我之前做的那样:

RKMappingOperation *operation = [[RKMappingOperation alloc] initWithSourceObject:self.moreStatuses destinationObject:newManagedObject mapping:mapping];

还需要调用 -(BOOL)saveToPersistentStore:(NSError **)error : 在您的 RKManagedObjectStore 上将其保存到您的 SQLite 数据库:

[store.persistentStoreManagedObjectContext saveToPersistentStore:&error];

这是我花了一段时间才弄清楚的另一件事!

【讨论】:

以上是关于RestKit 0.20.1 映射本地 JSON “此类不符合键值编码...”的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 键值映射到 RestKit 0.20.1 中的核心数据属性

RestKit“无法在没有数据源的情况下执行关系映射”来自本地 JSON 文件

如何使用带有 RKObjectMapping 的 RestKit 0.24 将本地 JSON 字符串映射到对象?

RestKit 0.20.1 如何映射父 ID

Restkit 0.20 对象在获取 json 响应后未映射

RestKit 0.20.1 复合键和嵌套关系