■delete - insert が問題になるケース
たとえば、 Core Data から全く同じ内容をフェッチして表示する二つのUITableViewがあるとします。それぞれ
A
および B
と名付けます。ここで、
A
を表示してから、 B
を表示する際に Core Data モデルを delete - insert すると、 A
を再度表示した際にアプリケーションがクラッシュします。原因はおそらく、 A
で既に読み込まれているモデルを B
が削除してしまっているため、 A
で既に削除されているモデルをテーブルが表示しようとしてクラッシュしているものだと思われます。 A
の viewWillAppear などのタイミングで、再度 Core Data からオブジェクトを取得し直せばこの問題は解決します。そもそも
NSFetchedResultsController
を使えばたぶんこの問題は発生しないと思うのですが、いずれにせよ変更があったデータをフェッチしなおさなければならなくなってしまいます。ということで可能な限りプライマリキー項目を設定して update で対応することをお勧めします。ただし update は update で sqlite3 の実行がやたら遅いということが分かっているのでこちらはこちらで別途チューニングが必要です。詳細はまた別エントリーにて。