2

今朝、iPhone アプリで大きな問題が発生しました。店から取り除かなければなりませんでした。

問題は、xcdatamodel に小さな変更を加えたことです。CoreData 移行のようなものが存在することが判明するまでは、更新プロセスが自動的に適切な方法で交換を行っていると考えていました。

UIManagedDocument を使用して永続ストアに接続しています。

このファイルを新しいファイルと交換するにはどうすればよいですか? 開発中に、デバイスからアプリ全体をアンインストールしてから再度インストールすると、すべてが機能しました。このプロセスをアプリ ストアで更新してシミュレートするにはどうすればよいでしょうか?

アップデート

このように移行オプションを設定しようとしています

_database = [[UIIManagedDocument alloc] init];
NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption],

_database.persistentStoreOptions = options;

しかし、アプリはまだクラッシュしています

** キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了します。理由: 'この NSPersistentStoreCoordinator には永続ストアがありません。保存操作を実行できません。


4

1 に答える 1

2

これの鍵は、xcdatamodel ファイルの複数のバージョンを管理することです。1 つのバージョンが現在のバージョンであり、古いバージョンに従って作成されたデータ ストアを開くために使用されます。その際、移行マッピングを使用して、あるモデルから別のモデルに変換します。これはすべてここで説明されています。

あなたの質問について:更新プロセスをどのようにシミュレートするか、実際には特別なことをする必要はありません:

  1. 古いバージョンをインストールします。

  2. そのデータ ストアにデータを入力します。

  3. Xcode を使用して、古いバージョンの上に新しいバージョンをインストールします。

新しいバージョンには新しいデータ モデルがあります。古いバージョンの上にインストールすると、古いデータ ストアが検出され、移行を試行する必要があります。これはまさに、App Store を介して更新を行うときに発生することです。アプリのバイナリは置き換えられますが、そのサンドボックス データはそのまま保持されるため、新しいバイナリは既にそこにあることがわかります。

お役に立てれば。

編集:

あなたのコードは短縮されているので、まだ行っていないかどうかはわかりませんが、次の方法で試すことができます。

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

こちらの投稿もご覧ください。

別のコインでは、自動移行が常に機能するとは限りません。モデルに加えた変更の種類によって異なります。機能しない場合は、カスタム移行モデルを指定する必要があります。これは、トピックに関する非常に有益な投稿です。

于 2012-09-04T10:22:09.190 に答える