没有存储在数据库中的 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 对象映射的主要内容,如果未能解决你的问题,请参考以下文章