从 CouchDB 和 Couchbase-lite 同步和删除已删除的文档

Posted

技术标签:

【中文标题】从 CouchDB 和 Couchbase-lite 同步和删除已删除的文档【英文标题】:Sync and delete removed documents from CouchDB and Couchbase-lite 【发布时间】:2018-11-26 16:49:41 【问题描述】:

我目前在我的 iosandroid 应用程序中使用 couchbase-lite 从运行 CouchDB 的数据库同步文件。

我经常删除不再需要的文件,并且我也希望从移动应用程序中删除相同的文件,但是任何拉复制只会拉更新或新文件,并且不会触发删除移动应用。

有没有什么方法可以从移动应用程序中删除不再在服务器数据库上的文档,而无需对移动应用程序进行完全清除,然后重新同步整个数据库?

【问题讨论】:

您是在服务器端还是移动端删除它们?复制也被设计为拉删除,但我不记得 CouchDB 是否遵循正确的程序。但是,如果您在移动端删除它们,删除将同步到服务器。 @borrrden 所以它是一种单向复制。用户将数据库同步到手机,并且不编辑任何内容。然后,当我更新信息(添加信息和删除信息)时,我也希望从用户手机中删除已删除的信息,因为它的时间已过,所以在一定时间后它就没有用了。但是如果我删除数据,当应用拉取时,它会在拉取复制后保留旧信息。 您是否知道 CouchDB 在您删除时是否保持修订历史完整?这将显示为带有_deleted 标志的新版本。如果您只是简单地从服务器中删除该值,那么它将不会被复制。只有“新修订”会被复制,这就是所谓的“墓碑修订”的原因。 @borrrden 我不确定,我会检查并找出答案。据我了解,我只覆盖文档,导致转速增加。我真正想要的是移动应用程序与服务器保持完美同步。 【参考方案1】:

您可以根据id从数据库中删除文档,如下所示:

try 
        for (Result result : docList) 
            String id = result.getString(0);
            Document doc = database.getDocument(id);
            database.delete(doc);
        
     catch (CouchbaseLiteException e) 
        e.printStackTrace();
     

要获取文档 ID,您必须查询如下内容:

Query query = QueryBuilder
    .select(SelectResult.expression(Meta.id), SelectResult.all())
    .from(DataSource.database(database))

ResultSet rs = query.execute();
    for (Result result : rs) 
        Dictionary data = result.getDictionary("db_name");
        Log.e("CouchbaseLite ", "document: " + data);
        Log.e("CouchbaseLite ", "id: " + result.getString(0));
    

【讨论】:

【参考方案2】:

从数据库类中有一个purgeDocument() 方法。这将从本地数据库中删除目标文档 - 目标文档的服务器副本保持不变。如果文档稍后更新,则文档将在下次复制时返回到本地客户端。

http://docs.couchbase.com/mobile/2.1/couchbase-lite-swift/Classes/Database.html

【讨论】:

以上是关于从 CouchDB 和 Couchbase-lite 同步和删除已删除的文档的主要内容,如果未能解决你的问题,请参考以下文章

如何从 couchdb 运行服务器端代码?

CouchDB 复制而不删除文档

从 couchdb 视图访问会话信息

从 CouchDB 提供静态 HTML

如何从 CouchDB 中提取 CouchApp

node.js 可以像 CouchApp 一样执行从 CouchDB 提取的 JavaScript 函数吗?如何?