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

9
我目前在我的iOS和Android应用程序中使用couchbase-lite来从运行CouchDB的数据库同步文件。
我会定期删除不再需要的文件,我希望移动应用程序中也删除相同的文件,但任何拉取复制仅拉取更新或新文件,并不会触发移动应用程序上的删除。
有没有办法从移动应用程序中删除不再存在于服务器数据库中的文档,而不必在移动应用程序上进行完整的清除,然后重新同步整个数据库?

你是在服务器端还是移动端删除它们?复制被设计为拉取删除操作,但我不记得CouchDB是否遵循正确的流程。但如果你在移动端将它们删除,则删除操作将同步到服务器。 - borrrden
@borrrden,所以这是单向复制。用户将数据库同步到手机上,不进行任何编辑。 然后,当我更新信息(添加信息和删除信息)时,我希望已删除的信息也从用户手机中删除,因为它们在一定时间后就变得无用了。但是,如果我删除数据,当应用程序拉取数据时,它会保留旧信息。 - Anthony Taylor
你是否知道当你删除CouchDB时,它是否会保留修订历史记录?这将显示为一个带有“_deleted”标志的新修订版本。如果你只是简单地从服务器中删除值,则不会被复制。只有“新修订版本”才会被复制,这就是所谓的“墓碑修订版本”的原因。 - borrrden
@borrrden 我不确定,我会查一下并找出答案。据我所知,我只会覆盖文档,导致版本号增加。我真正想要的是移动应用程序与服务器保持完美同步。 - Anthony Taylor
2个回答

0

0

您可以根据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));
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接