我的应用程序使用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];
}];
执行此操作会导致持久存储中出现重复对象。我错过了什么?
答案 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}}正确完成。