没有存储在数据库中的 RestKit 对象映射

Posted

技术标签:

【中文标题】没有存储在数据库中的 RestKit 对象映射【英文标题】:RestKit object mapping without store in database 【发布时间】:2014-05-11 20:27:54 【问题描述】:

实际上我有一个使用 RestKit 0.22 的项目。

在我的代码中,我添加了对象映射:

RKEntityMapping *materialMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Material class])
                                                       inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore];
...
RKResponseDescriptor *responseMaterialsDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:materialMapping
                                                                                                 method:RKRequestMethodGET
                                                                                            pathPattern:urlMaterials
                                                                                                keyPath:kRestApiMAterialsKeyPath
                                                                                            statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[[RKObjectManager sharedManager] addResponseDescriptor:responseMaterialsDescriptor];

通常这段代码可以正常工作,在请求正确的 url 后,我得到正确的响应并将对象存储到本地数据库。

现在我想请求相同的 url,但是在将 JSON 响应映射到 Material 对象之后,不将结果存储到数据库中。我想在一些修改后插入所有项目。您有什么建议可以避免使用 RestKit 将对象存储/保存到数据库吗?

【问题讨论】:

为什么不设置标识属性并允许 RestKit 更新现有项目?或者您的意思是您只想更新现有项目并忽略新项目(在这种情况下 KVC 验证是合适的)。 【参考方案1】:

如果您希望在映射后添加一些属性或修改现有属性,那么您应该使用 mappingMetadata 并从中创建 responseDescriptors。

[materialMapping addAttributeMappingsFromDictionary:@@"@metadata.property1": @"property1", @"@metadata.property2": @"property2"];
RKResponseDescriptor *materialResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:materialResponseDescriptor pathPattern:@"somPath" keyPath:@"" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

然后将响应描述符添加到 RKObjectManager 并创建一个 RKManagedObjectRequestOperation 用于从远程 url 获取,

  RKRoute *route = [[[[RKObjectManager sharedManager] router] routeSet] routeForName:routeName];
  [self cancelAllRequestWithMethod:route.method matchingPath:route.pathPattern];
  NSMutableURLRequest *request = [_objectManager requestWithPathForRouteNamed:routeName object:nil parameters:nil];
  RKManagedObjectRequestOperation *operation = [[RKManagedObjectRequestOperation alloc] initWithRequest:request responseDescriptors:[[RKObjectManager sharedManager] responseDescriptors]];
  operation.managedObjectContext = [RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext;
  operation.managedObjectCache = [RKManagedObjectStore defaultStore].managedObjectCache;
  operation.savesToPersistentStore = YES;

现在,设置映射元数据,即。这是在映射完成时将映射到原始属性的值,

[operation setMappingMetadata:@@"property1": value1, @"property2": value2];

然后,入队操作,它应该将自定义值映射到属性。注意,property1 和property 是实体中的属性,你不需要为它创建responseDescriptor。

[[RKObjectManager sharedManager] enqueueOperation:operation];

【讨论】:

感谢您的提示,但这不是我应该做的。基于映射的材料集合,我想在我的应用程序中执行一些条件更新过程并仅插入更新的项目。 如果您希望在保存之前更改对象,请使用 - setWillSaveMappingContextBlock: RKManagedObjectRequestOperation 上的方法。循环遍历您感兴趣的对象,然后在上下文实际保存之前从上下文中删除这些对象。 顺便说一句,RestKit 建议您在托管对象上使用 KVC valition github.com/RestKit/RestKit/wiki/…

以上是关于没有存储在数据库中的 RestKit 对象映射的主要内容,如果未能解决你的问题,请参考以下文章

在 Restkit 执行映射操作之前删除 Core data 中的现有对象

手动映射 JSON 对象时,RestKit 关系未映射

RestKit:在注销时重置持久存储后映射了 0 个对象

RestKit 从本地存储的 XML 解析/对象映射

RestKit、核心数据和关系问题。父对象不识别子集

RestKit 与特定核心数据对象的关系连接,无需键映射