0

在我的 android 应用程序中,我使用 sync_gateway 设置了拉复制。

由于特定应用程序的逻辑,每当检测到冲突时,我只需要保留从服务器复制的文档修订。

我能够定义哪个冲突版本来自复制(服务器),哪个来自本地修改(移动应用程序)。

如果我使用复制修订版中的数据创建墓碑和新修订版(这是建议的方法),我将有持续的冲突,因为本地修订版 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

我解决了这个问题,但问题是我很困惑。

这就是我从这里对我的帖子的回复中学到的:

  • 已删除的修订不能胜过未删除的修订,即使它们的修订号更高
  • 当你有冲突时,这意味着修订树中有开放的分支(开放分支我的意思是修订分支的末尾没有墓碑)
  • 如果您没有冲突,则意味着您可能有不同的修订分支,但除了一个之外,所有分支的末尾都有一个墓碑修订。没有墓碑的是当前(获奖)修订版
  • 如果所有分支都有一个墓碑,则表示您已删除该文档
  • 当代表当前(获胜)修订的开放分支被墓碑修订关闭时,仍然打开的分支(冲突分支)中的另一个开放分支被选为当前(获胜)修订。如果没有其他打开的分支,则该文档被视为已删除
  • 当一个不代表当前(获胜)修订(并因此产生冲突)的打开分支被墓碑修订关闭时,除了该分支不会再产生冲突之外,没有任何变化
于 2016-03-22T17:01:09.340 回答