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

RestKit + CoreData:从CoreData缓存中排除某些对象

RestKit CoreData 和 UIImage