我使用RESTKit已经有一段时间了,在数据库中加载json比较容易。但是,有时我一直在谷歌上搜索,却找不到解决这个问题的方法。
我建立了一个托管对象模型,使得三个不同的实体之间有一个直接的一对一的关系。我的模型的布局如下;

如果我在朋友类上加载对象,它也会根据朋友模型中的映射关系映射到其余两个模型。
如果用户连接他的facebook账户并在账户中链接,那么很明显,json的响应将包含linkedin和好友模型的映射。在这种情况下,联合申诉委员会的答复是;
[
{
"name":"foo bar",
"id":307,
"facebook":{
"name":"foo bar",
"username":"foo.bar.5074",
"id":"1000013421379389",
"picture":"https://fbcdn-profile-a.akamaihd.net/foo-bar.jpg"
},
"linkedin":{
"name":"foo bar",
"headline":"some headline",
"id":"1000013",
"link":"http://www.linkedin.com/foo.bar",
"image":"https://linkedin.com/foo-bar.jpg"
},
"picture":"https://fbcdn-profile-a.akamaihd.net/foo-bar.jpg"
},
{
...
}
]但是,一旦用户连接了Facebook和Linkedin,他也可以通过网站解除链接。因此,如果用户解除链接,json响应将不具有与一般情况相同的映射,并且可能不包含json响应中的facebook对象或linkedin对象,因此响应看起来类似于,
[
{
"name":"foo bar",
"id":307,
"facebook":{
"name":"foo bar",
"username":"foo.bar.5074",
"id":"1000013421379389",
"picture":"https://fbcdn-profile-a.akamaihd.net/foo-bar.jpg"
},
"picture":"https://fbcdn-profile-a.akamaihd.net/foo-bar.jpg"
},
{
...
}
]如果出现这样的响应,我想删除现有的链接为用户记录。或者,如果响应没有facebook,或者两者都有,我想删除本地记录和模型的关联,以响应中的空值为准。
我希望RESTKit自动删除相关的对象。我认为可以通过Restkit在对象加载器中指定fetch请求,但我对此不太确定。我使用加载器模式来加载对象,所以我将在哪里指定获取请求,
编辑的
RKObjectMappingProvider *provider = [RKObjectMappingProvider mappingProvider];
[provider setObjectMapping:[self objectMappingForFriend] forKeyPath:@""];
[provider setObjectMapping:[self objectMappingForFriend] forResourcePathPattern:resourcePath withFetchRequestBlock:^NSFetchRequest *(NSString *resourcePath) {
return [Friend fetchRequest];
}];
[[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader){
loader.mappingProvider = provider;
loader.delegate = self;
loader.method = RKRequestMethodGET;
}];_I认为我这里有多余的代码。_
这样,当响应为空时,我希望删除本地存储中的所有对象。但是,这对我不管用。我不知道该如何处理这个问题。
更新:当地时间2012年7月8日下午2:23
self.objectManager = [RKObjectManager objectManagerWithBaseURL:[NSURL URLWithString: @"https://mywebsite"]];
self.objectManager.client.disableCertificateValidation = YES;
self.objectManager.client.cachePolicy = RKRequestCachePolicyLoadIfOffline | RKRequestCachePolicyLoadOnError | RKRequestCachePolicyTimeout | RKRequestCachePolicyEtag;
self.objectManager.requestCache.storagePolicy = RKRequestCacheStoragePolicyPermanently;
self.objectManager.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES;
self.objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"test.sqlite" ];
self.objectManager.objectStore.cacheStrategy = [RKInMemoryManagedObjectCache new];现在,设置映射和加载数据,
RKObjectMappingProvider *provider = [RKObjectMappingProvider mappingProvider];
[provider setObjectMapping:[self objectMappingForFriend] forKeyPath:@""];
[provider setObjectMapping:[self objectMappingForFriend] forResourcePathPattern:resourcePath withFetchRequestBlock:^NSFetchRequest *(NSString *resourcePath) {
return [Friend fetchRequest];
}];
[[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader){
loader.mappingProvider = provider;
loader.delegate = self;
loader.method = RKRequestMethodGET;
}];更新:当地时间2012年7月8日下午4:11
似乎它正在删除一些空的本地对象,但是只有一些对象有引用,即使有空的json响应,主要的模型朋友仍然存在。
发布于 2012-07-18 06:42:02
这里有两个设置要配置。首先,在您的RKObjectMapping中,您将setNilForMissingRelationships设置为YES。然后,还需要确保Core数据关系具有正确的Delete规则(编辑关系时在实用程序面板中)。有关每个删除规则所做的描述,请参见这。
发布于 2012-07-18 09:45:04
我必须假设您使用的是最新版本的RestKit。所以,试试这句话:
[RKObjectManager sharedManager].objectStore.managedObjectCache = [RKFetchRequestManagedObjectCache new];对于一个成功的GET请求,它最终将调用RKManagedObjectLoader deleteCachedObjectsMissingFromResult:它将不缓存您的本地数据。这一原则在我以前回答你之前问题的文章中得到了更好的解释。
发布于 2012-11-08 22:13:09
下面是如何设置缓存策略
[RKObjectManager sharedManager].objectStore.cacheStrategy = [RKFetchRequestManagedObjectCache new];https://stackoverflow.com/questions/11530570
复制相似问题