我有一个RKPaginator
从服务器加载数据并将其保存到Core Data。这一切都像加载和分页时的魅力。但是,Core Data中的项目是持久的,因此每当我重新进入viewcontroller或重新启动App时,所有以前的分页数据仍然在Core Data中。
当我启动应用程序时,我想从一张干净的表开始。如何告诉Core Data刷新其内容?我尝试了以下代码,但它似乎只是有时工作,并且不规则地,可能是来自传入数据的计时错误。我真的很想在我从Api-Request获得成功回复时才刷新。
NSString *entityDescription = @"Activity";
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:weakSelf.managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *managedObject in items) {
[self.managedObjectContext deleteObject:managedObject];
}
我将如何实现这一目标?
答案 0 :(得分:1)
最简单的选择是在应用启动时从磁盘中删除Core Data存储文件并创建一个新文件。这显然不适用于在请求返回良好数据之后保留数据。
为此,您需要能够分辨出旧的和新的。 RestKit可以为你做到这一点,但如果你正在加载分页数据它将无法正常工作(它会删除你获得一个新页面时的页面。)
您可以使用类似于您拥有的代码(应该可以使用的代码),但是在请求的success
块中。在success
块中,您拥有所有新项目,因此您只需检查它是否是第一个请求(BOOL
实例变量),如果是,则删除不在的所有项目mappingResult
。
答案 1 :(得分:1)
我处于非常类似的情况,使用RestKit和Core Data。远程数据始终是最新的源,因此我希望Core Data“清除”远程数据库中不存在的内容。
我花了一些时间尝试做你想做的事 - 完全清除本地的持久存储 - 我尝试的每一种方式似乎都会引起问题。
RestKit具有内置功能,可以为您更新CoreData,并删除CoreData中不再存在于远程数据源中的那些实体(或者API不再为特定调用返回这些实体)。
它被称为“获取请求块”。
- (void)setupFetchRequestBlocksForObjectManager:(RKObjectManager*)manager
{
[manager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {
RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"article"];
NSDictionary *argsDict = nil;
BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict];
if (match) {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Article"];
fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"articleId" ascending:YES] ];
return fetchRequest;
}
return nil;
}];
}
在此示例中,我将描述此Fetch Request Block所针对的API调用,然后描述应与其匹配的CoreData请求。
将更改/删除与API调用返回的核心数据对象不同的任何核心数据对象。此示例适用于非常简单的API调用,但您也可以在匹配器中包含params,以便它只匹配更复杂的请求 - there's a good example of that on the RestKit site.
还有另外一个关于它的问题here.