0

実行時にテーブル/列をデータベースに追加したいと考えています。現在、コアデータを使用しています。XCode (新しいデータ モデル バージョンの追加) でそうする可能性があることは知っていますが、Web サービスからデータベース スキーマを受け取るため、その方法を使用することは絶対にできません。

Core Data を使用しているときに実行時に ddl コマンドを実行する可能性はありますか、それとも sqlite (またはラッパー/またはマッパー) を直接使用するだけで可能ですか? ラッパー/またはマッパーを使用する方が良い場合は、この場合に使用する必要がある提案を教えてください。

ワークフローは次のようになります。

  1. アプリを起動
  2. データベースが最新かどうかを確認する
  3. 新しいバージョンのスキーマが Web サービスから入手できる場合は、DDL コマンドを実行します
  4. アプリのワークフローを続行する

PS: XCode を使用してスキーマを変更する代替方法について説明する回答はご遠慮ください。

4

1 に答える 1

1

実行時に Core Data モデルを変更できますか? はい...しかし、おそらくあなたが望むようには機能しません。

Core Data の API を使用すると、実行時にデータ モデルのあらゆる詳細を構築または変更できます。Xcode のモデル エディターは便利ですが、必要に応じてスキップしてすべてをコードで行うこともできます。たとえば、NSEntityDescriptionproperties属性 (属性と関係の両方をカバーする) は書き込み可能です。新しいエンティティを作成しNSAttributeDescription、エンティティのプロパティを更新してそれを含めることができます。バン、エンティティに新しい属性を追加したところです。同様に、NSManagedObjectModelentitiesプロパティは書き込み可能であるため、新しいNSEntityDescriptionを作成してモデルに追加できます。これにより、実行時に作成された新しいエンティティが得られます。

しかし、これは大きな問題です。これは、データ ストアをロードする前にしか実行できません。永続ストアをロードすると、モデルを変更すると例外がスローされます。Core Data は、永続ストアをロードするときに、モデル ファイルをストア ファイルで使用されているモデルと比較します。それら一致する必要があり、ストアをロードした後にこの事実を変更することはできません。ストアをロードすると、モデルが固定されます。

さらに、永続ストアをロードする前にモデルを変更した場合でも、現在のバージョンのモデルに一致する永続ストアのみをロードできます。つまり、永続ストアを新しいモデルに移行するコードも作成しない限り、ロードできません。それがどれほど難しいかは、変更の性質によって異なります。少なくとも、以前に保存したデータをロードする前に変更を加え、モデルの移行を行って永続ストアを更新し、新しいモデルを使用するように手配する必要があります。

Core Data を使用すると、モデル (スキーマ) とデータが別々に保存され、ストアが読み込まれるときに一致します。これは SQLite が内部でどのように機能するかではなく、Core Data が実施するアプローチです。

于 2013-03-26T16:08:20.910 に答える