2013-12-20 30 views
0

我有一个RKPaginator从服务器加载数据并将其保存到核心数据。这一切在加载和分页时都很有用。但是,核心数据中的项目是持久性的,所以无论何时我重新进入视图控制器或重新启动应用程序,所有以前的分页数据仍在核心数据中。用新鲜的核心数据初始化RestKit的RKPaginator

我想从一张干净的纸张开始,当我启动应用程序。我如何告诉核心数据来清除其内容?我尝试了下面的代码,但它似乎只是有时和不规则地工作,可能来自传入数据的计时错误。实际上,只有当我从我的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

另一个问题在代码之后你保存了吗?你的实体是否有日期(如下载日期)? – Wain

+0

不,我没有保存。我会这样做,谢谢。我在实体中也没有下载日期。这不是服务器提供给我的东西。从服务器获取数据后,我需要设置吗? – Alan

+0

如果你想在获得回应后清除,你需要一些方法来告诉新的和旧的是... – Wain

回答

1

最简单的选择是在应用程序启动并创建一个新的应用程序时,从磁盘删除Core Data存储文件。这显然不会保持数据,直到请求返回好数据后。

为此,您需要能够分辨什么是旧的和什么是新的。 RestKit可以为你做到这一点,但如果你正在加载分页数据,它将无法正常工作(它会倾向于删除当你得到一个新的页面)。

您可以使用类似于您拥有的代码(应该可以工作)的代码,但可以在请求的success块中使用。在success块中,您拥有所有新项目,因此您只需检查它是否是第一个请求(BOOL实例变量),如果是,则删除不在mappingResult中的所有内容。

+0

最后的解决方案是我想要的。旧数据应该在新数据到达之前可见。谢谢。 – Alan

1

我处于非常相似的情况,使用RestKit和核心数据。远程数据始终是最新的数据源,所以我希望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; 
    }]; 
} 

在这个例子中,我所描述的API调用,读取请求块是,然后描述CoreData请求应该相匹配。任何与API调用返回的不一致的Core Data对象都将被更改/删除。

这个例子是一个非常简单的API调用,但你也可以包括在匹配PARAMS,使其只为更复杂的要求相匹配 - there's a good example of that on the RestKit site.

还有对SO它here.

+0

你是否在RKPaginator中使用这个例子?加载第二页记录会导致第一页的数据被删除? – Alan

+0

我没有使用RKPaginator,但我尝试过使用分页API调用。你必须小心NSFetchRequest返回与你调用的URL(包括params)相同的页面 - 它是一个适当的“匹配”。 链接中的示例更符合请求的参数。这样做确实更为复杂,但这是Fetch Request Blocks的用处,希望对RKPaginator的支持能够更好(如果它不在那里 - 请纠正我,如果我错了)。 – siburb

+0

我设法让Wain的例子工作得很好,所以现在我会坚持下去。但是当我获得更多时间时,我会尝试获取请求块,因为我想尽可能多地学习RestKit技术。当我到达那里时我会再次发帖。谢谢(你的)信息。 – Alan