CouchBase Lite本地数据库文档无法同步删除问题求助
问题排查与解决方案
嘿,我来帮你梳理下这个问题的核心原因和修复方案!
1. 最可能的核心问题:Pull复制未开启连续同步模式
你当前的代码里调用pullmaster.start()后,默认是一次性同步——它只会在启动时同步一次远程CouchDB和本地数据库的差异,之后远程发生的变更(比如删除文档)不会主动推送到本地,这就是删除操作没触发ChangeListener的关键原因。
修复方式:
在启动Pull复制前,设置为连续同步模式:
pullmaster.setContinuous(true);
修改后的startReplicators()代码:
public void startReplicators() { if (pullmaster != null) { pullmaster.setContinuous(true); // 开启连续同步,实时监听远程变更 pullmaster.start(); } if (pullwork != null) { pullwork.setContinuous(true); // 其他Pull复制同理按需设置 pullwork.start(); } if (pushwork != null) { pushwork.start(); } }
2. 调整ChangeListener的过滤逻辑
即使同步到了删除事件,你当前的逻辑有潜在的过滤问题:
- 远程删除文档后,CouchBase Lite会同步一个**墓碑文档(Tombstone)**到本地,此时
dc.isDeletion()会返回true,但event.isExternal()的判断可能因为版本兼容性问题,误过滤掉同步过来的删除事件。建议先去掉这个过滤,测试是否能触发回调:
master.addChangeListener(new Database.ChangeListener() { @Override public void changed(Database.ChangeEvent event) { // 去掉event.isExternal()的判断,确保不会过滤同步事件 for (DocumentChange dc : event.getChanges()) { if (dc.isDeletion()) { Document doc = event.getSource().getDocument(dc.getDocumentId()); try { doc.purge(); } catch (CouchbaseLiteException e) { e.printStackTrace(); } } } } });
注:CBL本身会自动清理墓碑文档,如果你不需要立即彻底删除,也可以不用调用purge(),等待自动清理即可。
3. 额外验证步骤
- 检查复制状态:给Pull复制添加状态监听,确认复制是否正常运行:
pullmaster.addChangeListener(new Replication.ChangeListener() { @Override public void changed(Replication.ChangeEvent event) { Log.d("ReplicationStatus", "当前状态: " + event.getReplication().getStatus() + ", 同步进度: " + event.getReplication().getCompletedChangesCount() + "/" + event.getReplication().getChangesCount()); } });
- 查看CouchDB日志:确认远程删除操作后,CouchDB是否正常响应了本地的复制请求,有没有权限或其他错误。
先从开启连续同步开始测试,这应该是解决你问题的核心步骤!
内容的提问来源于stack exchange,提问作者JoCuTo
相关产品推荐
相关产品推荐

