Xcode3 では問題はありませんでしたが、Xcode4 では、コア データ モデルを更新すると、Apple のコードが約 3 分の 1 の確率で失敗し、「永続ストアの移行に失敗しました。ソース管理オブジェクト モデルが見つかりません」という恐ろしいメッセージが表示されます。エラー。
これが私のセットアップです(プロジェクトを自動移行するように構成した方法):
- Apple のテンプレートからの NSPersistentDocument
- Apple のモデル読み込みメソッドをオーバーライドします。私が行う唯一のことは、自動移行をオンにする storeOptions ディクショナリで 2 つのフラグを提供することです。
-(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
{
NSMutableDictionary *newOptions = nil;
if( storeOptions != nil )
newOptions = [NSMutableDictionary dictionaryWithDictionary:storeOptions];
else
newOptions = [NSMutableDictionary dictionary];
[newOptions setValue:@"YES" forKey:NSMigratePersistentStoresAutomaticallyOption];
[newOptions setValue:@"TRUE" forKey:NSInferMappingModelAutomaticallyOption];
BOOL success = FALSE;
success = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newOptions error:error];
return success;
}
これが私が使用しているプロセスです(Xcode4の1つのバグをすでに回避しています!)
- モデルを選択します(Xcode4では「something.xcdatamodel」という名前で、左側にねじれがあります)
- エディタ メニューに移動し、[新しいモデル バージョンを追加...] を選択します。
- 新しいバージョンに前回より 1 大きい整数の名前を付けます。たとえば、前のバージョンが「4」の場合、新しいバージョンに「5」という名前を付けます。
- 右側のペインで、現在のモデル バージョンを新しく作成したバージョンに変更します。
- XCode4 バグの回避策: 任意のファイルを選択してから、新しく作成されたモデルを選択します。そうしないと、Xcode は新しく作成されたモデルで選択を表示しますが、代わりに以前のモデルを編集するため、CoreData のすべてが確実に破損します。
- モデルを編集します。この場合、既存のエンティティに新しい属性を追加しています
- 保存。建てる。走る。...クラッシュ。
私が言ったように、3回のうち約2回を除いて、これは正しく機能します。一度動作したら、(明らかに) 問題ありません。軽量の移行が完了し、次の保存で新しいモデル バージョンに保存されます。
したがって、上記の手順で間違っていることがあると思いますが、ドキュメントを5〜6回読んだことがありますが、明らかなことは何もわかりません。NSPersistentDocument のドキュメントがすべて古くなっていることは役に立ちませんが、私は iPhone でも軽量の移行を何度も行ってきたので、これを行うことにかなりの自信があり、正しいように思えます。
私が試した/チェックしたその他のこと: - iPhone Core Data Lightweight Migration Cocoa error 134130: ソース ストアのモデルが見つかりません(いいえ、ルート xcdatamodel のみが含まれていました)