12

Core Data Store があり、フラグ 'NSInferMappingModelAutomaticallyOption' を使用して、Core Data Model に変更を加えるたびに、最初に新しいモデル バージョンを作成し、データ モデルへの変更が自動的に移行されるようにします。

ただし、エンティティの 1 つの属性タイプを変更する必要があります。これを行うと、自動移行が機能していないようで、アプリを実行しようとすると Core Data エラーが発生します。

自動モデル移行を続行するためにこれを設定する方法はありますか?

4

2 に答える 2

15

これには軽量移行を使用できないため、少し難しくなりますが (Apple に感謝)、不可能ではありません。

Xcode 7.1で段階的に:

1. 新しいモデル バージョンを作成します。

  1. .xcdatamodeldモデルを選択-> Editor->Add model version ...
  2. 新しいモデルのエンティティの編集attribute type
  3. 現在のモデル バージョンを新しいバージョンに変更します (ファイル インスペクター)。緑色の目盛りが移動するはずです。

現行モデル

2. カスタム コア データ マッピング モデル

  1. New file -> Mapping Model(コアデータ -> マッピングモデル)
  2. sourceモデルの(from モデル) およびtarget(to モデル) バージョンを選択します
  3. カスタム マッピング モデルには、次のように呼ばれるエンティティ マッピングが含まれていますNameToName。このファイルのターゲット エンティティの変更された属性の値の式を変更すると、必要なものが反映されます。FUNCTION($entityPolicy, "<*transformingMethodName*>" , $source.<*attributeName*>)

- transformingMethodName: 属性タイプを変換するために呼び出されるカスタム メソッド。(次のステップで定義します - 待ってください)

- attributeName: 変更した属性名

  1. <*EntityName*>TransformationPolicyのサブクラスとしてクラスを作成するNSEntityMigrationPolicy
  2. transformingMethodName上記で定義した実装。(属性タイプを変更するために必要なことを行います)。このメソッドをヘッダーファイルにも追加したことを確認してください
  3. このクラスをカスタム エンティティ移行ポリシーとしてマッピング モデルに登録します (Model.xcmappingmodel -> ファイル インスペクター -> 3 列目 -> カスタム ポリシー -> TransformationPolicy クラスの名前を入力します)。

移行ポリシー クラスの登録

于 2015-11-10T21:34:59.107 に答える
13

ライトウェイト マイグレーションでは、属性タイプの変更はサポートされていません。

Core Data が推測されたマッピング モデルを生成できるようにするには、変更が明らかな移行パターンに適合する必要があります。次に例を示します。

  • 新しい属性の簡単な追加
  • 属性の削除
  • オプションではない属性がオプションになる
  • オプションの属性がオプションではなくなり、デフォルト値を定義する
  • エンティティまたはプロパティの名前変更

編集

軽量の移行を使用していると思います。しかし、スコットが指摘したように、あなたはそうではないかもしれません。自動移行 (軽量移行とは異なります) を使用する場合でも、マッピング モデルを提供することでこれを行うことができます。この場合:

Core Data は、アプリケーション バンドル内のソース モデルとマッピング モデルを特定し、移行を実行しようとします。

ただし、この移行は軽量ではありません。Core Data は、ソースとターゲットの 2 つのストアを開き、メモリ内のすべてのエンティティをコピーします。そのため、アプリが消費するメモリは、ストア内のデータ量によって異なります。

于 2013-07-08T20:08:02.233 に答える