RestKit / CoreData:在请求相同的URL两次时插入重复的对象而不是合并

时间:2014-04-09 19:06:13

标签: ios objective-c core-data restkit

我的应用程序使用RestKit从URL获取GET,其有效内容包含JSON中的对象(医院)列表。我第一次点击URL时,一切正常 - 有效负载被正确转换为一组Hospital被管对象,并将它们插入到持久存储中(通过执行获取请求并将结果与​​有效负载进行比较来验证) )。

如果我从同一个URL第二次执行GET,返回相同的有效负载,则RestKit会将另一组Hospital个对象(与第一个组相同)插入持久性存储中。我希望RestKit确定第二组Hospital对象与第一组完全相同,然后在必要时更新第一组对象。

有效负载包含一个名为provider_number的唯一标识符。

我在provider_number模型中添加了Hospital字段,并勾选了Indexed

我相应地在RKEntityMapping上设置了识别属性:

+ (RKEntityMapping *) hospitalMapping {
    RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Hospital" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
    [mapping setIdentificationAttributes:@[ @"provider_number"]];
    [mapping addAttributeMappingsFromDictionary:[self hospitalAttributeDictionary]];
    return mapping;
}

我使用持久性MOC在RKManagedObjectStore上创建了托管对象缓存,每http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html#overview

managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

RKObjectManager配置为使用持久性MOC:

RKManagedObjectStore *managedObjectStore = [RKManagedObjectStore defaultStore];
NSManagedObjectContext *managedObjectContext = [managedObjectStore persistentStoreManagedObjectContext];

RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:url];
objectManager.managedObjectStore = managedObjectStore;

RKObjectManager进一步配置了响应描述符和请求的响应MIME类型。

然后将映射操作排队:

[objectManager getObjectsAtPath:@""  
                     parameters:nil
                        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                           NSError *executeError = nil;
                           if([managedObjectContext saveToPersistentStore:&executeError]) {
                              NSLog(@"Saved hospitals to persistent store.");
                           }
                           else {
                              NSLog(@"Failed to save to data store");
                           }
                        } failure:^(RKObjectRequestOperation *operation, NSError *error) {

                           UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                           [alertView show];
                        }];

执行此操作会导致持久存储中出现重复对象。我错过了什么?

1 个答案:

答案 0 :(得分:1)

从这个日志中:

  

restkit.core_data:RKFetchRequestManagedObjectCache.m:124找到的对象'(   )'使用fetchRequest' (entity:Hospital; predicate:(provider_number == nil); sortDescriptors:((null)); type:NSManagedObjectResultType;)'

Restkit正在寻找现有项目,但谓词错误:predicate: (provider_number == nil)

现在还不清楚为什么。在RKFetchRequestManagedObjectCache.m开头的managedObjectsWithEntity:attributeValues:inManagedObjectContext:放置一个断点并检查堆栈以找出正在创建attributeValues的内容以及为什么provider_number不是{t}}正确完成。