17

ストアエンティティ属性を文字列から整数16に移行するのに問題があります。実行する手順は次のとおりです。

  1. モデルバージョンを追加...
  2. 新しいモデルで、Entity属性をStringからInt16に変更します。
  3. [ファイルインスペクター]>[バージョン管理されたコアデータモデル]>[現在のモデル]で新しいモデルを選択します
  4. 古いモデルと新しいモデルのマッピングモデルを作成します。
  5. 走る

エラーは次のとおりです。

未解決のエラーエラードメイン=NSCocoaErrorDomainコード=134140"操作を完了できませんでした。(Cocoaエラー134140)" UserInfo = 0xbd5cd20 {reason =移行用のマッピングモデルが見つからないか、自動的に推測できません、destinationModel = .. ..

マッピングモデルは、コンパイルされた.appにあります。

バンドル

とプロジェクトで:

ここに画像の説明を入力してください

移行は、整数16>整数32のような属性に対して、または属性名を変更するときに機能します。

単純なCoreDataプロジェクトを作成してみましたが、文字列から整数16への移行(マッピングモデルの有無にかかわらず)が自動的に機能しました。

最も奇妙な部分は、バンドル内のすべてのマッピングモデルをプログラムで探してみましたが、現在のソース/宛先モデルでは何も見つかりませんでした。

4

2 に答える 2

23

これは、CoreDataが属性を自動的に移行できないために発生します。これは、文字列が常にintに収まるとは保証できないためです(データが収まることがわかっている場合でも)。

したがって、実行する必要があるのは、マッピングモデルを使用することです。方法は次のとおりです。

  1. Xcodeで、新しいマッピングモデルを作成し([ファイル]>[新規]>[新しいファイル])、[コアデータ]セクションで[マッピングモデル]を選択します
  2. ウィザードでソースモデルとターゲットモデルを選択します
  3. これにより、基本的に軽量移行と同じ場所に配置されます。一部のマッピングをオーバーライドするオプションがあることを除いて、すべてが自動的に実行されます。具体的には、あなたに問題を与えているもの。
  4. 新しいマッピングポリシークラスを作成します(Extend NSEntityMigrationPolicy
  5. ソースインスタンスを提供するを実装createDestinationInstancesForSourceInstance:entityMapping:manager:error:して、その文字列をintに変換し、新しいストアに保存できるようにします。

コードは次のようになります。

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
    NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]];  

    // Copy all the values from sInstance into newObject, making sure to apply the conversion for the string to int when appropriate. So you should have one of these for each attribute:
    [newObject setValue:[sInstance valueForKey:@"xyz"] forKey:@"xyz"];

    [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping];
}
  1. 次に、マッピングモデルでそのポリシーを設定するだけです。マッピングモデルファイルを選択し、適切なエンティティマッピングを選択して、右側のパネルでCustomPolicyを設定します。

Core Dataを初期化する場合は常に、移行設定を変更して自動型推論を削除してください

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

それはそれであるはずです...

于 2012-05-31T13:10:25.787 に答える
1

「移行用のマッピングモデルが見つかりません」エラーで数千の槍を壊した人にとって、これは役立つかもしれません:

  1. 適切なフォルダ/グループにマッピングファイルを作成したことを確認してください(Cmd+を押す前に-プロジェクトナビゲータで.xcdatamodeldNファイルを選択してください)。
  2. プロジェクトをクリーンアップします。
  3. プロジェクトを再構築して実行します。

私の場合、アプリはclean/rebuildの後にマッピングモデルを自動的に見つけました=\

于 2015-03-30T02:56:53.203 に答える