1

Xcode3 では問題はありませんでしたが、Xcode4 では、コア データ モデルを更新すると、Apple のコードが約 3 分の 1 の確率で失敗し、「永続ストアの移行に失敗しました。ソース管理オブジェクト モデルが見つかりません」という恐ろしいメッセージが表示されます。エラー。

これが私のセットアップです(プロジェクトを自動移行するように構成した方法):

  1. Apple のテンプレートからの NSPersistentDocument
  2. 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つのバグをすでに回避しています!)

  1. モデルを選択します(Xcode4では「something.xcdatamodel」という名前で、左側にねじれがあります)
  2. エディタ メニューに移動し、[新しいモデル バージョンを追加...] を選択します。
  3. 新しいバージョンに前回より 1 大きい整数の名前を付けます。たとえば、前のバージョンが「4」の場合、新しいバージョンに「5」という名前を付けます。
  4. 右側のペインで、現在のモデル バージョンを新しく作成したバージョンに変更します。
  5. XCode4 バグの回避策: 任意のファイルを選択してから、新しく作成されたモデルを選択します。そうしないと、Xcode は新しく作成されたモデルで選択を表示しますが、代わりに以前のモデルを編集するため、CoreData のすべてが確実に破損します。
  6. モデルを編集します。この場合、既存のエンティティに新しい属性を追加しています
  7. 保存。建てる。走る。...クラッシュ。

私が言ったように、3回のうち約2回を除いて、これは正しく機能します。一度動作したら、(明らかに) 問題ありません。軽量の移行が完了し、次の保存で新しいモデル バージョンに保存されます。

したがって、上記の手順で間違っていることがあると思いますが、ドキュメントを5〜6回読んだことがありますが、明らかなことは何もわかりません。NSPersistentDocument のドキュメントがすべて古くなっていることは役に立ちませんが、私は iPhone でも軽量の移行を何度も行ってきたので、これを行うことにかなりの自信があり、正しいように思えます。


私が試した/チェックしたその他のこと: - iPhone Core Data Lightweight Migration Cocoa error 134130: ソース ストアのモデルが見つかりません(いいえ、ルート xcdatamodel のみが含まれていました)

4

3 に答える 3

3

またはを使用し[NSNumber numberWithBool:YES]ないでください。@"YES"@"TRUE"

于 2012-11-22T02:35:36.880 に答える
0

私は非常に混乱していましたが、これは機能しませんでした..メソッドにはすでに「ストアオプション」辞書があると想定していたため..前述のオプションを設定する前に、その存在を確認する必要がありました... </p>

-(BOOL)configurePersistentStoreCoordinatorForURL:       (NSURL*)u
                                          ofType:    (NSString*)t
                              modelConfiguration:    (NSString*)c
                                    storeOptions:(NSDictionary*)o 
                                           error:    (NSError**)e 
{  
 return [super configurePersistentStoreCoordinatorForURL:u
                                                  ofType:t
                                      modelConfiguration:c
                                            storeOptions:
    o ? [o dictionaryWithValuesForKeys:
         @[ NSMigratePersistentStoresAutomaticallyOption, @YES,  
            NSInferMappingModelAutomaticallyOption,       @YES]] 
      :  @{ NSMigratePersistentStoresAutomaticallyOption :@YES,
            NSInferMappingModelAutomaticallyOption       :@YES}
                                                  error:e];
}
于 2013-06-05T14:46:31.907 に答える
0

問題の原因として破損した開発ストアを排除したので、控えめに言ってもバグのある Xcode 4.x に問題があると思われます。多くの人が同様の問題を報告していますが、まったく同じ問題はないようです。これはおそらく特定のデータ モデルの設定でのみ発生するバグであり、問​​題を追跡するのは非常に困難です。

自動移行を放棄して、明示的な移行マップを作成するだけで済む場合があります。時間がかかり、コードが複雑になりますが、常に機能します。

出荷アプリを持っていて、実際にエンド ユーザーのデータを扱う場合は、エンド ユーザーのデータを保護するために追加の措置を講じる道徳的およびビジネス上の義務があります。

于 2011-07-26T15:57:14.247 に答える