アプリの最新バージョンで、既存のテーブルに 1 つの新しい列を追加しました。主要なものはなく、単純なフラグです。データ モデルのバージョンを上げて、それをアクティブなモデルに設定しました。最近の数回のアプリの更新では、軽量の自動移行戦略をうまく使用しています。
アプリの最新バージョンにアップグレードした後、一部のユーザーから、すべてのデータが失われ、CoreData との間で読み書きを試みるたびにアプリがクラッシュすることが報告されています。問題を再現できません。
すべてのユーザーではなく、ほとんどのユーザーで自動移行が機能するのはなぜですか?
答え
この特定の例では、問題は、いくつかのバージョンが古い xcdatamodel ファイルを知らないうちに誤って変更したことでした。アプリの新しいバージョンをリリースしたとき、非常に長い間更新していなかった少数のユーザーがいたため、彼らが持っていた xcdatamodel の「最新」バージョンは、誤って変更したファイルと同じでした。彼らのデバイスで移行を行おうとすると、移行のベースにしたいデータ モデル ファイルのバージョンが変更されていたため、停止しました。
これを修正するには、古い xcdatamodel ファイルで何を変更したかを特定し、変更を元に戻し、アプリの更新をリリースする必要がありました。この影響を受けるユーザーが最新バージョンに更新されると、移行は機能しました。
追加情報:
すべてに共通しているように見える唯一のことは、すべて iOS 6.1.3 を実行していることです。私はこれを自分で複製することはできません。iOS 6.1.3 を実行しているデバイスを使用していますが、アプリのあるバージョンから次のバージョンに何度アップグレードしても機能します。いくつかのバージョンをスキップして、古いバージョンから最新のものにアップグレードしようとしましたが、うまくいきました。
価値のあるものとして、私はこの投稿で概説されている自動移行戦略を使用しており、CoreData モデルに追加/削除されたいくつかの主要な新しいものを含め、過去 8 または 10 のアプリの更新で正常に機能しています。