Core data Restkit在核心数据映射之前截断数据库

Core data Restkit在核心数据映射之前截断数据库,core-data,restkit,truncate,restkit-0.20,Core Data,Restkit,Truncate,Restkit 0.20,我正在使用restkit将json映射到核心数据 每次用户启动应用程序时,我都需要调用例程 如果服务器有更新的数据要发送,我需要下载它们,截断我的表并将数据插入表中,如果服务器不向我发送数据,我就不必做任何事情 显然,我只想在确定新数据已下载时截断当前数据,而不是之前 我怎样才能做到这一点 这是我的代码: NSURL *endpoint = [NSURL URLWithString:kBaseURL]; RKObjectManager* objectManager = [RKObjectMana

我正在使用restkit将json映射到核心数据

每次用户启动应用程序时,我都需要调用例程

如果服务器有更新的数据要发送,我需要下载它们,截断我的表并将数据插入表中,如果服务器不向我发送数据,我就不必做任何事情

显然,我只想在确定新数据已下载时截断当前数据,而不是之前

我怎样才能做到这一点

这是我的代码:

NSURL *endpoint = [NSURL URLWithString:kBaseURL];
RKObjectManager* objectManager = [RKObjectManager managerWithBaseURL:endpoint];

[objectManager.HTTPClient setAuthorizationHeaderWithToken:@"username:my-token-12345"];
objectManager.managedObjectStore = [RKManagedObjectStore defaultStore];

[RKObjectManager setSharedManager:objectManager];

RKEntityMapping *entityMapping = [RKEntityMapping mappingForEntityForName:@"Medic" inManagedObjectStore:objectManager.managedObjectStore];
[entityMapping addAttributeMappingsFromDictionary:@{
                                                    @"identifier":          @"identifier",
                                                    @"name":                @"name",
                                                    @"surname":             @"surname",
                                                    @"personalAddress":     @"personalAddress",
                                                    @"hospital":            @"hospital",
                                                    @"hospitalAddress":     @"hospitalAddress",
                                                    @"oldDigitalAgreement": @"oldDigitalAgreement",
                                                    @"oldPaperAgreement":   @"oldPaperAgreement"}];
entityMapping.identificationAttributes = @[@"identifier"];

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

[objectManager addResponseDescriptor:responseDescriptor];


[[RKObjectManager sharedManager] getObjectsAtPath:kregistryURL
                                       parameters:nil
                                          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                              // done
                                          }
                                          failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                              UIAlertView * alertView = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"attention", nil) message:NSLocalizedString(@"communication.genericerror.title", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];
                                              [alertView show];
                                          }
 ];
回答后的解决方案

[objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {
    RKPathMatcher* pathMatcher = [RKPathMatcher pathMatcherWithPattern:kregistryURL];

    NSDictionary *dic = nil;
    if ([pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:YES parsedArguments:&dic]) {

        NSFetchRequest *fetchRequest = [NSFetchRequest new];

        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Medic"
                                                  inManagedObjectContext: [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext];
        fetchRequest.entity = entity;
        return fetchRequest;
    } else
        return nil;
}];
你的问题是

如果服务器什么也不给我发,我什么都不用做

我猜服务器仍然会发送一个200响应,而不是一个特殊的状态码(应该是
304'未修改'
)。因为如果您没有这个要求,您可以使用删除获取请求块(这是正确的解决方案)


目前,您可能需要自己执行删除操作,方法是从数据存储中提取现有项并对其进行迭代,检查该项是否在成功块中提供给您的映射结果中,如果不在,则从上下文中删除它…

mmh,好的,我可以将其更改为304。但是,在json解析之后和插入核心数据之前,如何截断数据库?我想我应该使用managedObjectRequestOperationWithRequest:success:failure:但是在成功块中插入已经完成,我需要删除所有数据并插入新数据!请参阅“获取请求块和删除孤立对象”一节。谢谢,但就我对pathMatcherWithPattern的理解而言,它会在占位符上迭代:airport_id以组成一个新URL并获取该id的特定json,如果我只有一个json,其中包含所有对象呢?好的,我想我做到了!我已经添加了代码!非常感谢你!