0

私は現在、Ensembles を使用していくつかのテストを行っています。具体的には、Core Data ライトの移行をテストしています。

私の現在の構成は次のとおりです。

  • データ モデル 1 でアプリを実行しているデバイス A
  • データ モデル 2 でアプリを実行しているデバイス B
  • データ モデル 2 はデータ モデル 1 に基づいており、オプションの文字列プロパティが 1 つ追加されています。

私のシナリオは次のとおりです。

  • 最初に、デバイス A とデバイス B の両方でデータ モデル 1 を使用してアプリを実行すると、Ensembles (iCloud 構成) を使用してすべてが正常に同期されました。
  • デバイス B で、データ モデル 2 を使用して更新したアプリをインストールして実行します
  • デバイス A で、データ モデル 1 を使用して古いアプリを実行し続け、新しいレコードを追加します
  • 結果: デバイス A に追加された新しいレコードが iCloud にアップロードされ、デバイス B に同期されます。

私の質問: 関連するデータ モデルが最新のものでない場合に、変更が iCloud にアップロードされないように Ensembles を構成できますか? (つまり、私の場合、デバイス A はデータ モデル 1 に基づいてオブジェクトをアップロードしますが、iCloud は既にデータ モデル 2 に基づいています)

前もって感謝します!

更新 1:

ドリューさん、ご回答ありがとうございます。Ensembles は分散型のピア ツー ピア システムであるため、アップロードを防止できない (そしておそらく防止すべきではない) ことに、私は間違いなく同意します。

理想的には、新しいデータ モデルを使用するデバイスが、古いデータ モデルに基づくデータを無視するようにしたいと考えています。(古いデータ モデルを持つデバイスが新しいデータ モデルに基づくデータを無視する既存の動作と同様の方法で)。それはサポートされていますか?

そうでない場合は、次のシナリオを例として検討してください。

  • 古いデータ モデルには、タイトルと作成者の 2 つのプロパティを持つ「Book」というエンティティがあります (両方のフィールドはオプションではありません)。
  • 新しいデータ モデルには、タイトル フィールドの最初の文字を保持する必要がある、titleFirstLetter と呼ばれる新しいオプション プロパティがあります。

現在、Ensembles が関与していない場合は、新しい NSManagedObject を永続ストアに保存するときに完全に制御できます。したがって、新しい本の追加を担当するアプリの更新されたコードは、タイトル フィールドから最初の文字を抽出し、それを新しい titleFirstLetter プロパティに保存するようにします。(つまり、Catch-22 というタイトルの本は、本が保存されると、titleFirstLetter プロパティに C が含まれます)。

さらに、コア データ スタックで軽度の移行が発生すると、それを検出し、データベース内の既存のすべての本を反復処理する 1 回限りの手順を実行し、タイトルの値に従って titleFirstLetter を設定します。この時点以降、データベースは一貫性があり有効であり、新しいコードにより、データベースに追加された将来の本がデータベースを有効に保つことが保証されます。

Ensembles に関して、古いデータ モデルを持つデバイスからの古いデータを制御できない場合、コードが呼び出されない場合、titleFirstLetter の新しいプロパティをどのように入力できますか?

親切なお力添えありがとうございます!

4

1 に答える 1

1

防ぐことはできません。Ensembles は、分散型のピアツーピア システムです。あるデバイスが別のデバイスの現在の状態を知る方法はまったくないため、アップロードを防ぐことはできませんでした。

更新されたデバイスは、他のデバイスからの古いデータを処理できる必要があります。古いモデルのデバイスは、新しいモデルも更新されるまで、新しいモデルに基づくデータを無視します。次に、無視されたすべてのデータをマージします。

可能な限り移行を避け、トリッキーなリファクタリングではなく、プロパティやエンティティの追加などの単純なことに固執することをお勧めします。多くの変更を行う必要がある場合は、単純に新しいアンサンブルから始めることを検討してください (たとえば、アンサンブル識別子を変更します)。

于 2016-03-02T14:38:02.690 に答える