実行時に Core Data モデルを変更できますか? はい...しかし、おそらくあなたが望むようには機能しません。
Core Data の API を使用すると、実行時にデータ モデルのあらゆる詳細を構築または変更できます。Xcode のモデル エディターは便利ですが、必要に応じてスキップしてすべてをコードで行うこともできます。たとえば、NSEntityDescription
のproperties
属性 (属性と関係の両方をカバーする) は書き込み可能です。新しいエンティティを作成しNSAttributeDescription
、エンティティのプロパティを更新してそれを含めることができます。バン、エンティティに新しい属性を追加したところです。同様に、NSManagedObjectModel
のentities
プロパティは書き込み可能であるため、新しいNSEntityDescription
を作成してモデルに追加できます。これにより、実行時に作成された新しいエンティティが得られます。
しかし、これは大きな問題です。これは、データ ストアをロードする前にしか実行できません。永続ストアをロードすると、モデルを変更すると例外がスローされます。Core Data は、永続ストアをロードするときに、モデル ファイルをストア ファイルで使用されているモデルと比較します。それらは一致する必要があり、ストアをロードした後にこの事実を変更することはできません。ストアをロードすると、モデルが固定されます。
さらに、永続ストアをロードする前にモデルを変更した場合でも、現在のバージョンのモデルに一致する永続ストアのみをロードできます。つまり、永続ストアを新しいモデルに移行するコードも作成しない限り、ロードできません。それがどれほど難しいかは、変更の性質によって異なります。少なくとも、以前に保存したデータをロードする前に変更を加え、モデルの移行を行って永続ストアを更新し、新しいモデルを使用するように手配する必要があります。
Core Data を使用すると、モデル (スキーマ) とデータが別々に保存され、ストアが読み込まれるときに一致します。これは SQLite が内部でどのように機能するかではなく、Core Data が実施するアプローチです。