如何在couchbase复制期间保持复制的修订?

时间:2016-03-18 18:07:58

标签: android couchbase-lite couchbase-sync-gateway

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

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

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

如果我使用复制修订版中的数据(suggested approach)创建逻辑删除和新版本,我将会出现连续冲突,因为本地版本ID将始终与服务器上的版本不同(任何用于选举currentRevision的新版本都会有不同的ID。

我最好的解决方案是将服务器版本保留为当前版本并丢弃任何其他版本。

我该怎么做?

是否可以清除修订版?或者是否可以创建一个仅包含服务器修订的对象,以便在冲突解决后,任何其他没有冲突的拉动只会更新我的文档?我需要一种类似于覆盖的行为。

2 个答案:

答案 0 :(得分:1)

这取决于解决冲突的结果应该是什么:

  • 合并文档属性:在这种情况下,您需要创建一个新修订,其属性来自每个冲突的修订版,然后删除所有修订版。

  • 清理相互冲突的修订版:在这种情况下,您可以删除除要保留的修订版之外的所有修订版。您可能希望保留的修订版本不是当前版本,但删除所有其他修订版本将使其成为当前版本。

请参阅TodoLite-Android冲突解决示例(https://github.com/couchbaselabs/ToDoLite-Android/blob/bcd87faa4c68a7cee075468b08da55c8041830a7/ToDoLite/src/main/java/com/couchbase/todolite/ListConflicts.java#L51-L81)。

答案 1 :(得分:1)

我解决了这个问题,但问题是我在混淆。

所以这是我学到的,感谢对my post here的回复:

  • 删除的修订版无法赢得未删除的修订版,即使版本号较高
  • 也是如此
  • 当你有冲突时,它意味着修订树中有开放的分支(并且使用开放分支,我指的是一个在其末尾没有墓碑的修订分支)
  • 如果您没有冲突,则意味着您可能拥有不同的修订分支,但除了一个之外,所有分支都有一个墓碑修订版。没有墓碑的那个是当前(获胜)修订版
  • 如果所有分支都有墓碑,表示您已删除文档
  • 当代表当前(获胜)版本的开放分支用逻辑删除修订关闭时,仍然打开的分支(冲突分支)中的另一个开放分支被选为当前(获胜)修订。如果没有其他开放分支,则该文档被视为已删除
  • 如果一个没有表示当前(获胜)修订版(从而产生冲突)的开放分支用逻辑删除修订版关闭,除了该分支不再产生冲突外,没有任何变化