2012-08-05 78 views
0

我在tabbarcontroller的第二个选项卡上设置了以下代码。我第一次进入标签时,正如我们所料,我的数据被正确提取。但是,如果我离开选项卡并返回,则获取请求返回的array包含条目的两倍。它返回的每个对象都是重复的。如果我离开选项卡并再次返回,则条目会再次复制,每个条目都有3个。我的请求有什么问题会导致这种情况发生?FetchRequest在后续执行中返回重复结果

- (void)viewWillAppear:(BOOL)animated { 
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:delegate.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // sort the results, since we want the most recent entry first 
    NSSortDescriptor *dateSort = [[NSSortDescriptor alloc] initWithKey:@"key" ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:dateSort]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSError *error; 
    NSMutableArray *array = [[delegate.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy]; 
    NSLog(@"error %@",[error localizedDescription]); 
    self.fetchedObjects = [array copy]; 
    [array removeAllObjects]; 

    [self.tableView reloadData]; 
} 

更新:我切换到NSFetchedResultsController这个固定我的问题。

回答

0

切换到NSFetchedResultsController并解决了问题。

0

没有立即显示为什么会发生这种情况,但围绕实际获取本身的可疑编码表明您的委托方法或控制器的其他部分可能存在一些错误。

您是否还在使用抓取的结果控制器?你以后要更改fetchObjects集合吗?

数据库实际上是否包含所有这些额外的对象,还是仅仅是这个控制器中的数组?

此外,请注意,在viewWillAppear中执行所有这些工作可能不是一个好选择。

+0

不,我没有使用抓取的结果控制器。我不改变集合,只是在表格视图中显示它。数据可以从另一个选项卡中添加,这就是为什么我在viewWillAppear中重新获取数据的原因。数据库不包含额外的对象,只包含后续调用的数组。 – 2012-08-06 00:21:18

+0

您应该在此控制器的每个方法中放置一个断点,并查看数组中的计数更改的位置。你碰巧有一个setFetchedAttributes的自定义实现吗? – 2012-08-06 00:28:41

+0

执行提取时,计数加倍。如果我在提取之前和之后检查数组,我可以看到重复的条目。在第一次执行时,它返回正确的金额。不,我没有自定义的实现。 – 2012-08-06 00:33:02

0

如果你试着改变你的代码self.fetchedObjects = [[delegate.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];

你能不能也给我们更多的代码,包括实现UITableViewDataSource & UITableViewDelegate methods