gpt4 book ai didi

ios - RestKit/核心数据 : Duplicate objects inserted instead of merged when requesting the same URL twice

转载 作者:行者123 更新时间:2023-11-29 12:48:43 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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];
}];

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

最佳答案

来自这个日志:

restkit.core_data:RKFetchRequestManagedObjectCache.m:124 Found objects '( )' using fetchRequest ' (entity: Hospital; predicate: (provider_number == nil); sortDescriptors: ((null)); type: NSManagedObjectResultType; )'

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

目前尚不清楚原因。在 managedObjectsWithEntity:attributeValues:inManagedObjectContext: 开头的 RKFetchRequestManagedObjectCache.m 中放置一个断点,然后检查堆栈以找出 attributeValues 是什么正在创建以及为什么 provider_number 没有正确完成。

关于ios - RestKit/核心数据 : Duplicate objects inserted instead of merged when requesting the same URL twice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22971789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com