3

我有一个 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 是否存在,如果存在,则进行更新与插入,或者什么。

4

3 回答 3

1

从最新的 RESTKit 版本 (0.23) 开始,您可以像这样定义主键:

[_mapping addAttributeMappingsFromDictionary:@{ @"id" : @"objectId", @"name" : @"name" }];
[_mapping setIdentificationAttributes:@[ @"objectId" ]];

而 objectId 是核心数据对象的主键。

于 2014-07-28T21:49:37.380 回答
0

您似乎做得正确,当您的 didLoadObjects 回调发生时,您应该能够查询核心数据以获取您需要的对象。

您的获取请求的设置方式可能存在问题。使用最新的 RestKit,您可以使用 RKObjectMappingProvider 的

- (void)setObjectMapping:(RKObjectMappingDefinition *)objectMapping forResourcePathPattern:(NSString *)resourcePathPattern withFetchRequestBlock:(RKObjectMappingProviderFetchRequestBlock)fetchRequestBlock;

函数并让 fetchRequestBlock 获取正确的数据。

不过,RestKit 并没有真正开箱即用地处理部分更新请求。在非常活跃的 RestKit google 组中,您可能会有更多的运气。

于 2012-05-08T17:19:15.597 回答
0

Quote: 我没有看到在 XCode 的数据模型中将我的 ID 字段设置为“主键”的方法。我尝试在我的 didFinishLaunchingWIthOptions 方法中执行此操作: userMapping.primaryKeyAttribute = @"id";

请记住,“primaryKeyAttribute”是您的 api 有效负载中的一个,而不是 CoreData 自己管理的 CoreData id。RestKIt 然后将(不可见的)CoreData 主键映射到指定的 JSON 键。

于 2012-10-25T17:43:33.467 回答