私には理解できない奇妙な問題があります。私は、SQLite ストアからオブジェクトをフェッチするというUIViewController
かなり典型的なものを持っています。典型的なボイラープレートで、フェッチは正常に機能し、テーブルは正常に機能します。UITableView
NSFetchedResultsController
NSFetchedResultsController
-(void)controllerWillChangeContent:(NSFetchedResultsController *)controller{
[self.tableView beginUpdates];
}
-(void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type{
if(type==NSFetchedResultsChangeInsert){
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
} else if(type==NSFetchedResultsChangeDelete){
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
}
}
-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath{
UITableView *tV = self.tableView;
if(type==NSFetchedResultsChangeInsert){
[tV insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
} else if(type==NSFetchedResultsChangeDelete){
[tV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else if(type==NSFetchedResultsChangeUpdate){
[self configureCell:[tV cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
} else if(type==NSFetchedResultsChangeMove){
[tV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tV insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
[self.tableView endUpdates];
}
私が抱えている問題は、リレーションシップが nil であるオブジェクト (リレーションシップ プロパティが述語またはソート記述子のフェッチ要求に関与していない場合でも) は、いつでもフェッチされた結果から消える (controller:didChangeObject:
で呼び出されるNSFetchedResultsChangeDelete
) ことです。なんらかの方法で更新されます (たとえば、無関係なプロパティの変更)。フェッチを再実行すると、オブジェクトが返されます。
これは、フェッチ リクエストで述語を使用しない場合でも発生します。
ここで何が起こっているのか誰にも分かりませんか?