RestKit/CoreData 未更新 - 创建重复项
Posted
技术标签:
【中文标题】RestKit/CoreData 未更新 - 创建重复项【英文标题】:RestKit/CoreData not updating - creating duplicates 【发布时间】:2012-05-08 14:44:41 【问题描述】:我有一个 ios 5 应用程序,它不创建任何数据 - 它只是对 REST Web 服务进行 GET 调用,并用这些记录填充 sqlite 数据库。当本地数据库中没有记录时,初始 GET 效果很好。但是,当我进行后续调用时,我只会返回自上次 GET 以来数据已更改的记录子集。但是正在发生的事情是记录只是被再次添加,而不是更新现有记录。
我有一个 ID 字段,它是主键(或应该是主键),当有一条 ID 已经存在的记录进入时,我希望更新该数据。如果该 ID 不存在,它应该是一个插入。
我没有看到在 XCode 的数据模型中将我的 ID 字段设置为“主键”的方法。我尝试在我的 didFinishLaunchingWIthOptions 方法中这样做:
userMapping.primaryKeyAttribute = @"id";
但仅此一项似乎并没有真正起到任何作用。
这是我实际执行 GET 的调用:
// Load the object model via RestKit
[objectManager loadObjectsAtResourcePath:[@"/synchContacts" appendQueryParams:params] delegate:self];
这似乎是自动完成所有事情。在这一点上,我不知道应该在哪里放置逻辑以检查 ID 是否存在,如果存在,则进行更新与插入,或者什么。
【问题讨论】:
【参考方案1】:从最新的 RESTKit 版本 (0.23) 开始,您可以像这样定义主键:
[_mapping addAttributeMappingsFromDictionary:@ @"id" : @"objectId", @"name" : @"name" ];
[_mapping setIdentificationAttributes:@[ @"objectId" ]];
而 objectId 是核心数据对象的主键。
【讨论】:
【参考方案2】:您似乎做得正确,当您的 didLoadObjects 回调发生时,您应该能够查询 Core Data 以获取您需要的对象。
您的获取请求的设置方式可能存在问题。使用最新的 RestKit,您可以使用 RKObjectMappingProvider 的
- (void)setObjectMapping:(RKObjectMappingDefinition *)objectMapping forResourcePathPattern:(NSString *)resourcePathPattern withFetchRequestBlock:(RKObjectMappingProviderFetchRequestBlock)fetchRequestBlock;
函数并让 fetchRequestBlock 获取正确的数据。
尽管开箱即用,RestKit 并不能真正很好地处理部分更新请求。在非常活跃的 RestKit google 小组中,您可能会有更多的运气。
【讨论】:
【参考方案3】:引用: 我没有看到在 XCode 的数据模型中将我的 ID 字段设置为“主键”的方法。我尝试在我的 didFinishLaunchingWIthOptions 方法中这样做: userMapping.primaryKeyAttribute = @"id";
请记住,“primaryKeyAttribute”是您的 api 有效负载中的一个,而不是 CoreData 自己管理的 CoreData id。 RestKIt 然后将(不可见的)CoreData 主键映射到指定的 JSON 键。
【讨论】:
以上是关于RestKit/CoreData 未更新 - 创建重复项的主要内容,如果未能解决你的问题,请参考以下文章
Restkit + Coredata - NSFetchedResultsControllerDelegate 回调不会单独为更新操作触发
RestKit CoreData 0.20.3 - 映射完成后保存 MOC 之前的额外检查
RestKit / Core Data / Offline - 我需要 UUID 还是 RestKit 足够聪明?
RestKit + CoreData,理解 RKManagedObjectRequestOperation