0

私の Android アプリでは、sync_gateway でプル レプリケーションをセットアップしました。

特定のアプリのロジックにより、競合が検出されるたびに、サーバーからレプリケートされたドキュメントのリビジョンだけを保持する必要があります。

どの競合バージョンがレプリケーション (サーバー) からのもので、どれがローカル変更 (モバイル アプリ) からのものかを定義できます。

複製リビジョンからのデータを使用してトゥームストーンと新しいリビジョンを作成すると (これが推奨されるアプローチです)、ローカル リビジョン ID がサーバー上の ID とは常に異なるため、継続的な競合が発生します (選択に使用される新しいリビジョンはすべて、 currentRevision の ID は異なります)。

私の最善の解決策は、サーバーのリビジョンのみを現在のリビジョンとして保持し、他のリビジョンを破棄することです。

これどうやってするの?

リビジョンをパージすることは可能ですか? または、サーバーのリビジョンのみを含むオブジェクトを作成して、競合の解決後に競合のない他のプルがドキュメントを更新するようにすることは可能ですか? オーバーライドに似た動作が必要です。

4

2 に答える 2

1

それは、競合解決の結果がどうあるべきかによって異なります。

  • ドキュメント プロパティのマージ: この場合、競合する各リビジョンのプロパティを持つ新しいリビジョンを作成し、すべてのリビジョンを削除する必要があります。

  • 競合するリビジョンのクリーンアップ: この場合、保持したいリビジョンを除くすべてのリビジョンを削除できます。保持したいリビジョンが現在のリビジョンではない可能性がありますが、他のすべてのリビジョンを削除すると、それが現在のリビジョンになります。

TodoLite-Android の競合解決の例 ( https://github.com/couchbaselabs/ToDoLite-Android/blob/bcd87faa4c68a7cee075468b08da55c8041830a7/ToDoLite/src/main/java/com/couchbase/todolite/ListConflicts.java#L51-L81 ) を参照してください。

于 2016-03-20T15:50:34.017 に答える
1

私は質問を解決しましたが、問題は私が混乱していたことです。

だから、これは私の投稿への返信のおかげで私が学んだことです:

  • 削除されたリビジョンは、リビジョン番号が高くても、削除されていないリビジョンに勝つことはできません
  • コンフリクトがある場合、それはリビジョン ツリーに開いているブランチがあることを意味します (開いているブランチとは、最後に墓石を持たないリビジョン ブランチを意味します)
  • コンフリクトがない場合は、異なるリビジョン ブランチが存在する可能性がありますが、1 つを除くすべてのブランチの最後に廃棄リビジョンがあることを意味します。トゥームストーンのないものは、現在の (勝っている) リビジョンです。
  • すべてのブランチにトゥームストーンがある場合は、ドキュメントを削除したことを意味します
  • 現在の (勝者の) リビジョンを表す開いているブランチが廃棄リビジョンで閉じられると、まだ開いているブランチ (競合するブランチ) の中の別の開いているブランチが現在の (勝者の) リビジョンとして選択されます。他に開いているブランチがない場合、ドキュメントは削除されたと見なされます
  • 現在の (勝利した) リビジョンを表していない (したがって競合を生成する) 開いているブランチが廃棄リビジョンで閉じられた場合、そのブランチが競合を作成しないこと以外は何も変わりません。
于 2016-03-22T17:01:09.340 に答える