我有一个不创建任何数据的ios 5应用程序 - 它只是对REST Web服务进行GET调用,并使用这些记录填充sqlite数据库。当本地数据库中没有记录时,初始GET很有用。但是,当我进行后续调用时,我将只返回自上次GET以来数据已更改的记录子集。但正在发生的事情是,记录只是再次添加,而不是更新现有记录。
我有一个ID字段,它是主键(或应该是),当记录进入其ID已存在时,我希望更新数据。如果该ID不存在,则应为插入。
我没有看到将我的ID字段设置为XCode中数据模型中的“主键”的方法。我尝试在didFinishLaunchingWIthOptions方法中执行此操作:
userMapping.primaryKeyAttribute = @"id";
但仅此一点似乎并没有做任何事情。
这是我实际执行GET的呼吁:
// Load the object model via RestKit
[objectManager loadObjectsAtResourcePath:[@"/synchContacts" appendQueryParams:params] delegate:self];
这似乎可以自动完成所有事情。到目前为止,我在丢失逻辑以检查ID是否存在,以及是否存在更新与插入,或者是什么时,我迷失了。
答案 0 :(得分:1)
从最新的RESTKit版本(0.23)开始,您可以像这样定义主键:
[_mapping addAttributeMappingsFromDictionary:@{ @"id" : @"objectId", @"name" : @"name" }];
[_mapping setIdentificationAttributes:@[ @"objectId" ]];
而objectId是核心数据对象的主键。
答案 1 :(得分:0)
您似乎正确地执行此操作,并且当您的didLoadObjects回调发生时,您应该能够查询Core Data以获取所需的对象。
您的获取请求设置方式可能存在问题。使用最新的RestKit,您可以使用RKObjectMappingProvider的
- (void)setObjectMapping:(RKObjectMappingDefinition *)objectMapping forResourcePathPattern:(NSString *)resourcePathPattern withFetchRequestBlock:(RKObjectMappingProviderFetchRequestBlock)fetchRequestBlock;
函数并让fetchRequestBlock获取正确的数据。
尽管如此,RestKit并没有真正处理部分更新请求。你可能会在非常活跃的RestKit谷歌群上获得更多运气。
答案 2 :(得分:0)
引用: 我没有看到将我的ID字段设置为XCode中数据模型中的“主键”的方法。我尝试在didFinishLaunchingWIthOptions方法中执行此操作: userMapping.primaryKeyAttribute = @“id”;
请记住,'primaryKeyAttribute'是来自api有效负载的,而不是CoreData id,CoreData自行管理。然后,RestKIt将(不可见的)CoreData主键映射到指定的JSON密钥。