RestKit - 不符合键值编码

Posted

技术标签:

【中文标题】RestKit - 不符合键值编码【英文标题】:RestKit - Not key value coding-compliant 【发布时间】:2013-05-21 14:13:41 【问题描述】:

我有一个托管对象 MyEntity,我在整个应用程序中使用它没有任何问题。

@interface MyEntity : NSManagedObject

@property (nonatomic, retain) NSString *code;
@property (nonatomic, retain) NSNumber *def_value;
@property (nonatomic, retain) NSString *label;
@property (nonatomic, retain) NSString *link_label;
@property (nonatomic, retain) NSNumber *order;

@end

我有一个网络服务 http://my_server/MyEntity 会返回给我:

[
    
        CODE: "TYPE",
        LABEL: "Administrative",
        ORDER: "3",
        DEF_VALUE: "0",
        LINK_LABEL: ""
    ,
    
        CODE: "TOPIC",
        LABEL: "NDF",
        ORDER: "1",
        DEF_VALUE: "0",
        LINK_LABEL: "Administrative"
    ,
    
        CODE: "TOPIC",
        LABEL: "Report",
        ORDER: "2",
        DEF_VALUE: "1",
        LINK_LABEL: "Administrative"
    ,
    
        CODE: "TOPIC",
        LABEL: "Other",
        ORDER: "3",
        DEF_VALUE: "0",
        LINK_LABEL: "Administrative"
    , ...
]

我正在尝试映射并获取此列表

NSURL *baseUrl = [NSURL URLWithString: @"http://my_server"];
NSString *objName = @"MyEntity";
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
[RKManagedObjectStore setDefaultStore:managedObjectStore];
[managedObjectStore createPersistentStoreCoordinator];

RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL: baseUrl];
RKEntityMapping *objMap = [RKEntityMapping mappingForEntityForName:objName inManagedObjectStore:managedObjectStore];
[objMap addAttributeMappingsFromDictionary: @
     @"CODE": @"code",
     @"LABEL": @"label",
     @"ORDER": @"order",
     @"DEF_VALUE": @"def_value",
     @"LINK_LABEL": @"link_label",
 ];

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:objMap pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[objectManager addResponseDescriptor:responseDescriptor];
[objectManager getObjectsAtPath:objName parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
    NSLog(@"ok");
 failure:^(RKObjectRequestOperation *operation, NSError *error) 
    NSLog(@"ko");
];

它给了我这个错误

我 restkit.network:RKHTTPRequestOperation.m:185 GET'http://my_server/MyEntity'(200 OK) CoreData:错误:无法调用 NSManagedObject 类“MyEntity”上的指定初始化程序 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因: '[valueForUndefinedKey:]:实体(null)不符合键“link_label”的键值编码。'

我在 2 或 3 个 SO 问题上看到了这个错误,但每个问题都有不同的问题,似乎不是我的问题。

有人可以帮我调试吗?

【问题讨论】:

较早的错误Failed to call designated initializer on NSManagedObject class 'MyEntity' 是一个更直接的问题,可能是键值编码异常的原因。 【参考方案1】:

您需要完全配置objectManager

objectManager.managedObjectStore = managedObjectStore;

您还没有完成核心数据堆栈初始化:

[managedObjectStore createManagedObjectContexts];

【讨论】:

这个cannot create managed object contexts: The persistent store coordinator does not have any persistent stores 在 createPersistentStoreCoordinator 之后调用,是吗? 我打电话给createPersistentStoreCoordinator 然后createManagedObjectContexts 您是否进行了调试以确保 managedObjectModel 以及之后的所有内容实际存在? 我使用这个模型几个月以来,每次访问数据时都不需要 10 行配置。无论如何,这个问题是关于“不符合键值编码”的,所以也许我会问另一个问题。实际上我想我要实现自己的对象映射器,因为 RestKit 对我来说似乎太复杂了。谢谢你的回答。

以上是关于RestKit - 不符合键值编码的主要内容,如果未能解决你的问题,请参考以下文章

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

RestKit - 不符合键值编码,在 JSON 中没有根

对于使用 RestKit v0.20.0 的键 Text,此类不符合键值编码

CoreData 严重应用程序错误:实体不符合键值编码

使用 Restkit 0.20 映射此类与键的键值编码不兼容

RestKit 和键值编码......如何解决重复元素?