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

dictにエントリがありますか? – iProgrammer

+0

はいdictにはエントリが含まれています –

答えて

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

はい私はセクションが1つしかありません。 –

+0

私はちょうど答えのplzのチェックを編集しました。 –

2

[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に2つ以上の要素がある場合に、selectedEventsが設定されていることに起因し、新しい要素を更新することなく1つが削除されます。selectedEvents行をループしてみると、少なくとも1つはfarになり、例外が発生します。

fetchedObjectsに直接インデックスにforループを変更:

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

...当面の問題を解決しますが、あなたはフェッチとselectedEvents配列を同期しようとしているに依存している場合は、あなたのコードは常に、脆弱になります結果コントローラ。

関連する問題