0

私はアプリケーションの更新に取り組んでいます。私はアプリケーションを最初から書き直し、モデルを制御するために魔法の記録に切り替えました。私の問題は次のとおりです。

  1. 「foo」という名前のエンティティを含む新しい「newdatabase.xcdatamodel」ファイルを作成しました。
  2. アプリの最初のリリースでは、「foo」という名前のエンティティも含まれる「olddatabase.xcdatamodel」もありました。
  3. ユーザーがアプリケーションを最初からインストールする場合、問題はありません。
  4. ユーザーが以前のバージョンのアプリを使用している場合、そのデバイスには「olddatabase.mom」ファイルがあり、このファイルには古い「foo」エンティティも含まれているため、ご想像のとおり、アプリケーションは次のエラーでクラッシュしました。

'foo''という名前の2つの異なるエンティティを持つモデルをマージできません

では、新しいmomファイルをロードする前に、古い「olddatabase.mom」ファイルを検出して削除することは可能ですか?

私は次のコードを試しましたが、思ったとおり、そのフォルダーに対する権限がありません:)

    NSString *path = [[NSBundle mainBundle]pathForResource:@"olddatabase" ofType:@"mom"];
if(path){
    NSError* error = nil;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager removeItemAtPath:path error:&error];
    if(error)
        NSLog(@"Error: %@",[error description]);
}
NSLog(@"path = %@",path);

新しい「foo」エンティティ名を「foo2」などに変更することを考え始めていますが、使用するものに適切な名前を使用することに夢中になっているので、方法があるかどうかを知ってうれしいです。それ。

読んで(おそらく)応答してくれてありがとう:)

4

2 に答える 2

2

OK私はまったく同じ問題を抱えていました、そしてこれが私がそれを解決した方法です...

私の新しい.xcdatamodelDは別の名前でした。私の場合、バンドルを検索して不平を言う代わりに、特定のmomdを使用するようにMagic Recordを指定できるため、これは重要だと思います。

'foo''という名前の2つの異なるエンティティを持つモデルをマージできません

ですから、それは非常に簡単です。Magic Recordに、新しいmomdを具体的に使用し、次のセットアップ呼び出しを使用してコアデータスタックを作成するように指示します...

[MagicalRecord setDefaultModelNamed:@"new_name.momd"];
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"new_foosql.sqlite"];

必要に応じて、古いsqlデータストアを削除できます。それが必要な場合は、コアデータのリセットに関する多くの回答がスタックにあります。

于 2013-06-14T15:19:50.143 に答える
1

あなたが説明したことは意味がありません:

A.バンドルから何かを削除することはできません。読み取り専用です。

B.人々があなたの新しいバージョンを更新するとき、あなたのバンドルにolddatabase.momがあってはなりません。ほとんどの場合、アプリのユーザードキュメントフォルダーにあります。

私があなたの問題を正しく読んだ場合、あなたが必要とするのはコアデータの移行です。 これを試して。

編集:参考までに

OPのテキストを読み直した後、上のBの部分は正しくありませんでした。しかし、OPはこれを回答として受け入れたため、SOは回答の削除を許可しませんでした。

于 2013-03-27T09:03:37.707 に答える