使用 RestKit 将一个裸露的 URL 数组映射到核心数据实体

Posted

技术标签:

【中文标题】使用 RestKit 将一个裸露的 URL 数组映射到核心数据实体【英文标题】:Using RestKit to map a a naked array of URLs to Core Data Entities 【发布时间】:2013-09-30 20:13:58 【问题描述】:

我正在从 Web 服务中获取裸 JSON 数组中的一些 URL,如下所示:

[
    "https://server1.com",
    "https://server2.com"
]

我想将这些映射到单独的核心数据实体,但遇到断言失败:

I restkit.network:RKObjectRequestOperation.m:180 GET 'https://server-test.com/Client/Endpoints'
*** Assertion failure in NSDictionary *RKEntityIdentificationAttributesForEntityMappingWithRepresentation(RKEntityMapping *__strong, NSDictionary *__strong)(), /Users/jonukas/MyApp/Pods/RestKit/Code/CoreData/RKManagedObjectMappingOperationDataSource.m:83
An uncaught exception was raised
Expected a dictionary representation

FWIW,在RKManagedObjectMappingOperationDataSource.m:83 上设置断点表明应该是NSDictionary 的表示实际上是RKMappingSourceObject

这是我制作的映射:

RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"MyURL"
                                               inManagedObjectStore:self.manager.managedObjectStore];

[mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil
                                                                  toKeyPath:@"url"]];

RKResponseDescriptor *descriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping
                                                                                method:RKRequestMethodGET
                                                                           pathPattern:@"Client/Endpoints"
                                                                               keyPath:nil
                                                                           statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[self.manager addResponseDescriptor:descriptor];

我的实体只有一个可转换类型的属性 (url)。这是NSManagedObject 子类:

@interface MyURL : NSManagedObject

@property (nonatomic, retain) id url;

@end

是我的映射不正确还是我的实体描述/对象模型有问题(请原谅,我刚开始使用 Core Data)?

更新:我尝试设置标识属性,但似乎没有帮助:

[mapping setIdentificationAttributes:@[@"url"]];

RestKit/ObjectMapping 启用跟踪日志记录会导致:

D restkit.object_mapping:RKMapperOperation.m:377 Executing mapping operation for representation: (
    "https://server1.com",
    "https://server2.com"
)
 and targetObject: (null)
T restkit.object_mapping:RKMapperOperation.m:320 Examining keyPath '<null>' for mappable content...
D restkit.object_mapping:RKMapperOperation.m:297 Found mappable collection at keyPath '<null>': (
    "https://server1.com",
    "https://server2.com"
)
*** Assertion failure in NSDictionary *RKEntityIdentificationAttributesForEntityMappingWithRepresentation(RKEntityMapping *__strong, NSDictionary *__strong)(), /Users/jonukas/MyApp/Pods/RestKit/Code/CoreData/RKManagedObjectMappingOperationDataSource.m:83
…

我猜 (null) targetObject 可能是我的问题。

更新 2:RestKit 0.21.0 修复了该问题。

【问题讨论】:

【参考方案1】:

将您的核心数据模型中的url 属性更改为String 类型。通过将其设置为transformable RestKit 无法正确解释应该是什么数据类型,因此它选择了字典并变得相当混乱。

我假设您将其设置为可转换,因为您想要一个 NSURL。 RestKit 无法为您做到这一点,因此您应该使用瞬态属性来实现该目标。

【讨论】:

我将数据模型中的 url 属性更改为类型 String (以及 NSManagedObject 子类中的 NSString *),但我仍然遇到同样的错误。跨度> 打开映射的跟踪日志并检查 RestKit 正在做什么。它是否正确解释数据类型?另外,再读一遍异常,你有没有设置任何标识键? 我之前尝试添加一个标识密钥,但似乎没有什么不同。我已经用我从跟踪日志中得到的内容和我使用的标识属性修改了这个问题。 好的,所以我认为这完全是另外一回事。您使用的是最新的 RestKit 主版本吗?您在引发异常的第 83 行看到了什么代码? 我在 restkit github 中看不到该代码。我建议你升级到 0.21.0 并验证代码库。

以上是关于使用 RestKit 将一个裸露的 URL 数组映射到核心数据实体的主要内容,如果未能解决你的问题,请参考以下文章

Restkit 将多个 json 提要映射到同一个数组

使用 RESTKit 将 url 参数映射到对象

RestKit 0.20 使用 nsdata 发布数组 Json

使用 RestKit 将 JSON“关联数组”映射到 CoreData

带有数组映射的restkit嵌套对象

RestKit:将单个对象映射到现有数组