2012-08-05 45 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