我一直在使用RESTKit一段时间,并且更容易加载json将它们保存在数据库中。但是,我一直在谷歌搜索,无法找到解决这个问题的方法。
我有一个托管对象模型设置,使得三个不同的实体彼此之间具有直接的一对一关系。我的模型的布局是:
如果我在Friend类上加载对象,它还会根据Friend模型中的映射关系映射到其余两个模型。
假设用户连接他的Facebook帐户并在帐户中链接,那么很明显json响应将包含linkedin和朋友模型的映射。在这种情况下,json响应是;
[
{
"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实现,但我并不是特别确定。我正在使用加载器模式来加载对象,以便在哪里指定获取请求,
EDITED
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日下午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响应,主模型Friend仍然存在。
答案 0 :(得分:4)
您可以在此处配置两个设置。首先,在RKObjectMapping中将setNilForMissingRelationships设置为YES。然后,您还需要确保核心数据关系具有正确的删除规则(在编辑关系时在“工具”面板中)。有关每个删除规则的用途的说明,请参阅this。
答案 1 :(得分:2)
我必须假设您使用的是最新版本的RestKit。所以,试试这一行:
[RKObjectManager sharedManager].objectStore.managedObjectCache = [RKFetchRequestManagedObjectCache new];
对于成功的GET请求,它最终将调用[RKManagedObjectLoader deleteCachedObjectsMissingFromResult:],这将解除您的本地数据。在我之前对您上一个问题的回答中所链接的文章中,该原则得到了更好的解释。
答案 2 :(得分:2)
以下是设置缓存策略的方法
[RKObjectManager sharedManager].objectStore.cacheStrategy = [RKFetchRequestManagedObjectCache new];
答案 3 :(得分:1)
使用新的RestKit,可以使用fetchRequest块作为;
来完成 [[RKObjectManager sharedManager] addFetchRequestBlock:[self fetchRequestBlock]];
-(RKFetchRequestBlock)fetchRequestBlock{
RKFetchRequestBlock fetchRequestBlock = ^NSFetchRequest*(NSURL *url){
if( [url.relativePath isEqualToString:@"api/app/v1/network_contacts"] ){
return [NSFetchRequest fetchRequestWithEntityName:@"Person"] ;
}
return nil ;
};
return fetchRequestBlock;
}
此方法查询本地数据库并比较远程对象,如果未匹配则从本地存储中删除该对象。