如何在 RestKit 中保存到 Core Data RKMappingResult 对象?

Posted

技术标签:

【中文标题】如何在 RestKit 中保存到 Core Data RKMappingResult 对象?【英文标题】:How to save to Core Data RKMappingResult object in RestKit? 【发布时间】:2014-01-22 22:35:27 【问题描述】:

我尝试保存从服务器获取的核心数据 NSManagedObject。但我不知道如何将从success block 中的[mappingResult firstObject] 获得的对象保存到Core Data。我怎样才能做到这一点?我应该使用RKObjectManager's postObject 还是RKManagedRequestOperation?在此之前我应该​​做[managedObjectContext insertNewObjectForEntityForName:@""]吗?我在官方文档中找不到任何关于这种情况的说明,需要一些帮助。

**编辑:**我像这样初始化RKManagedRequestOperation

RKResponseDescriptor* responseDescriptor =[RKResponseDescriptor
                                           responseDescriptorWithMapping:[UserMapping mappingForUser]
                                           method:RKRequestMethodPOST
                                           pathPattern:kUserEndpoint
                                           keyPath:@"profile"
                                           statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

RKRequestDescriptor* requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[UserMapping mappingForUserProfileModel] 
                                                                               objectClass:[User class] rootKeyPath:@"profile" method:RKRequestMethodPOST];


[[RKObjectManager sharedManager] addRequestDescriptor:requestDescriptor];
[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];

userObject =  [User new];

NSDictionary* userParameters = @ @"user_id" : [User sharedUser].userId;


[[RKObjectManager sharedManager] appropriateObjectRequestOperationWithObject:resumeObject method:RKRequestMethodPOST
                                                                        path:kUserEndpoint
                                                                  parameters:userParameters];


RKManagedObjectRequestOperation* managedRequest = [[RKManagedObjectRequestOperation alloc]
                                                   initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", kService, kUserEndpoint]]]
                                                   responseDescriptors:@[responseDescriptor]];

managedRequest.managedObjectContext = _managedObjectContext;

[managedRequest setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 


    NSLog(@"MAPPING = %@", [mappingResult firstObject]);


 failure:^(RKObjectRequestOperation *operation, NSError *error) 

];
[[RKObjectManager sharedManager] enqueueObjectRequestOperation:managedRequest];

EDIT2: RestKit 不会将映射数据保存到 CoreData。但 userObject.title 完美保存:

    userObject =  [_managedObjectContext insertNewObjectForEntityForName:@"User"];
    userObject.title = @"USER_NAME";

    NSDictionary* userParameters = @ @"user_id" : [User sharedUser].userId;

    [[RKObjectManager sharedManager] postObject:userObject path:kUserEndpoint parameters:userParameters
                                        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

                                         failure:^(RKObjectRequestOperation *operation, NSError *error)  ];

【问题讨论】:

【参考方案1】:

你需要退后一步,因为你的建议是在黑暗中拍摄的。

如果您使用托管对象存储配置您的对象管理器并使用实体映射创建响应描述符,那么当您收到请求的结果数据时,这将被转换为托管对象。在调用成功块之前,这些对象将自动保存到核心数据存储中。

您要创建的任何其他对象都可以照常创建,您需要显式保存上下文。

使用 RestKit 发送请求本身不会更改存储内容,只有响应会导致更改。

【讨论】:

感谢您的快速响应,但我有一些问题:“这些对象将在调用成功块之前自动保存到核心数据存储区。”。我怎么会知道这件事?如何找回它们?以及如何为此初始化 RKManagedRequestOperation? 您像往常一样检索它们 - 获取请求(它们也在映射结果中提供)。 RKManagedRequestOperation 用于向服务器发送请求,该服务器将使用响应数据创建托管对象... 你能告诉我如何为此初始化RKManagedRequestOperation。查看我的编辑我是如何做到这一点的 - 我有一个例外 the entity (null) is not key value coding-compliant for the key "name" 但我的实体有它。 听起来您的代码数据堆栈设置不正确。你为什么使用RKManagedObjectRequestOperation?您的代码看起来不需要,您可以使用管理器... "你为什么使用 RKManagedObjectRequestOperation?"因为用户是NSManagedObject 子类...【参考方案2】:

请参阅本教程。有一个使用 RestKit 与对象管理和代码数据的例子

https://github.com/alexanderedge/RestKitTutorial1

【讨论】:

以上是关于如何在 RestKit 中保存到 Core Data RKMappingResult 对象?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Restkit 在 Core Data 中删除后保存对象使其崩溃

RestKit 到 Core Data 的映射和加载零对象。 RKManagedObjectLoader

RestKit / Core Data / Offline - 我需要 UUID 还是 RestKit 足够聪明?

如何将 PUT 请求添加到 RestKit + Core Data?

如何在restkit映射后和保存到实体之前清除旧实体?

Core Data 没有第一次保存