2011-07-17 10 views
1

Xcode3には何の問題もありませんでしたが、「永続的なストアの移行に失敗し、ソースマネージドオブジェクトモデルがありません」というコアデータモデルを更新すると、Xcode4でAppleのコードが3回に1回失敗します。エラー。Xcode4のモデルを壊さずに正しく更新するにはどうすればよいですか?

ここに私のセットアップ(私は自動移行するには、プロジェクトの設定方法)です:

  1. NSPersistentDocument、Appleのテンプレート
  2. 上書きAppleのモデルローディング方式から、と私は唯一のものは、提供することです
-(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; 
} 

自動移行をオンにstoreOptions辞書に2つのフラグは、ここで私は、プロセスの(すでにXcode4で約1バグを作業している!)を使用して」VEの

  1. 移動エディタのメニューに(左に曲がりくねって、Xcode4に 『something.xcdatamodel』という名前の)モデルを選択し、 [新しいモデルのバージョンを追加...]を選択します。
  2. 名前の最後に1より大きい整数を指定します。選択し、任意のファイルを選択します。以前は、「4」は、新しいものが右側のペインで「5」
  3. 、XCode4バグのための新しく作成された1つの
  4. の回避策を現在のモデルのバージョンを変更する名前だった場合新しく作成されたモデルそうでない場合、Xcodeは新しく作成されたモデルの選択を表示しますが、代わりに以前のモデルを編集するため、CoreDataのすべてが完全に破損します。
  5. モデルを編集します。この場合、既存のエンティティに新しい属性を追加します。
  6. 保存します。ビルド。実行します。 ...クラッシュ。

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

私は上記の手順で間違っていることを推測していますが、私はドキュメントを5〜6回読んできましたが、何も明らかではありません。 NSPersistentDocumentドキュメントが古くなっているのを助けませんが、私はiPhoneでたくさんの軽量マイグレーションを行っています。だから私はこれを行うことに合理的に自信を持っています。


他のものは、私がチェック/試してみた: - iPhone Core Data Lightweight Migration Cocoa error 134130: Can't find model for source store(いや、唯一のルートxcdatamodelが含まれていた)

+0

クラッシュでエラーが発生しますか? – TechZen

+0

開発ビルドを移行しようとしていますか? – TechZen

+0

店舗の同じコピーを何度も繰り返し使用しているのですか、毎回新しいコピーを開始していますか? – TechZen

答えて

0

あなたが問題の原因として壊れて開発ストアを排除していますので、I Xcode 4.xに問題があると思われます。多くの人が同様の問題を報告していますが、2つの問題はまったく同じではありません。特定のデータモデルのセットアップでのみ発生するのはおそらくバグですので、問題を追跡するのは非常に難しいでしょう。

自動移行を放棄し、明示的な移行マップを作成するだけで済みます。それは時間がかかり、コードに複雑さをもたらしますが、常に機能します。

あなたが出荷アプリを持っていて、野生のエンドユーザーデータを扱う場合、エンドユーザーデータを保護するための特別な手順を踏む義務があります。

+0

Xcode4のCoreDataの処理には明らかなバグがたくさんありますが、私が間違っていることが分かりました。 Appleがそれを修正するのを望んでいるのです – Adam

3

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

+0

NSStringの[boolValue]は組み込みで、指定したコードとまったく同じ "YES"を評価します – Adam

+0

[NSNumber numberWithBool:あなたのNSStringでboolValueを呼び出さない、ブール値が期待されている、それは常にtrueに評価されます。つまり、numberWithBool:@ "NO"は理論的にはYES(真)です。 – lupinglade

0

私は非常に混乱していましたが、これはうまくいきませんでした。私はすでにメソッドが "store options"辞書を持っていると仮定していたので、私はそれを確認する必要がありました前述のオプション...

-(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]; 
} 
関連する問題