3

我有一個使用tableview和NSFetchedResultsController的應用程序。我得到的錯誤:NSFetchedResultsController錯誤:'NSInternalInconsistencyException',原因:'索引0處索引1沒有對象'

Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no object at index 1 in section at index 0' 

...從下面的代碼。 selectedevents是一個數組,其數量等於獲取結果控制器中的對象的數量。

NSManagedObjectContext *context = [fetchedResultsController managedObjectContext]; 
NSMutableArray *array=[[NSMutableArray alloc] init]; 
for (int i=0; i<[self.selectedEvents count]; i++) { 
    CustomDictionary *dic=[selectedEvents objectAtIndex:i]; 
    if (dic.isSelected) { 
     Event *evt=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 
     [array addObject:evt]; 
    } 
} 
for (Event *evt in array) { 
    [context deleteObject:evt]; 
} 
NSError *error; 
if (![context save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 
+0

你有沒有在詞典中的條目? – iProgrammer

+0

是的字典包含條目 –

回答

2

in the code below "selectedevents" is an array whose count is equal to that of objects in fetched results controller.

error says that 'no object at index 1 in section at index 0' your fetched result controller may have multiple sections.

此外,代碼應該是:

NSManagedObject *evt=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 

...不是:

Event *evt=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 
+0

是的,我只有一個部分。 –

+0

我剛編輯答案plz檢查。 –

2

試圖立足另一個ARR唉[NSFetchedResultController fetchedObjects]是危險的,因爲提取的結果控制器總是自動更新自身。你的問題是由這個循環造成的:

for (int i=0; i<[self.selectedEvents count]; i++) { 
     CustomDictionary *dic=[selectedEvents objectAtIndex:i]; 
     if (dic.isSelected) { 
      Event *evt=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 
      [array addObject:evt]; 
     } 
    } 

...循環兩次時,你只用[NSFetchedResultController objectAtIndexPath:]有一個對象退貨。這可能是由於在fetchedObjects具有兩個或更多個元素時被設置,然後在不更新selectedEvents的情況下刪除一個用於新計數。當你試圖循環遍歷行時,你至少要去一個並獲得異常。

改變for循環索引直接fetchedObjects

for (int i=0; i<[[fetchedResultsController fetchedObjects] count]; i++) 

...將解決眼前的問題,但你的代碼將永遠是脆弱的,如果你依靠試圖將selectedEvents陣列所獲取的同步結果控制器。

相關問題