如何检测Firestore的Countries集合中是否有文档存在或已被删除
Firestore集合删除状态同步最优方案
首选方案:软删除/墓碑记录(通用性最强、成本最低)
- 调整服务端/后台的国家文档删除逻辑,不要直接物理删除文档:
- 给需要删除的国家文档新增
isDeleted布尔字段,赋值为true,同时更新文档的lastUpdate字段为当前服务器时间戳。如果有存储空间优化需求,也可以单独建一个CountryDeletions集合,每次物理删除国家文档时,往该集合插入一条包含deletedDocId(被删文档ID)、deleteTime(删除时间戳)的记录。 - 客户端增量拉取逻辑同步调整:每次拉取变更时,同时请求
lastUpdate > lastCountriesUpdate的国家文档,以及(如果用了独立删除集合)deleteTime > lastCountriesUpdate的删除记录。 - 处理返回结果时,标记了
isDeleted=true的文档、或者删除集合中记录的文档ID,直接从本地缓存中移除即可,其他数据正常更新本地缓存,最后更新lastCountriesUpdate为当前时间戳。
这个方案完全适配你现有的增量更新逻辑,不需要额外增加固定读操作,仅在实际有删除事件发生时才会产生对应删除记录的读成本。
- 给需要删除的国家文档新增
适配你场景的轻量备选方案:定期全量ID校验
因为你当前的Countries集合只有25条数据,全量拉取ID的成本极低,也可以用这个方案快速实现:
- 给本地加一个
lastFullIdCheck的SharedPreferences标记,设置每7天或者每10次进入CountriesFragment时触发一次全量ID校验:- 发起查询
firebaseFirestore.collection("Countries").get(),处理结果时仅提取所有返回文档的ID,不需要解析文档内容,单批次25次读操作的成本几乎可以忽略。 - 把拿到的服务端全量ID列表和本地缓存的国家ID列表做差集,本地存在但服务端ID列表不存在的条目直接删除即可。
- 发起查询
高实时性可选方案:短生命周期快照监听
如果需要国家列表的变更实时同步给用户,可以仅在CountriesFragment处于前台可见状态时,给Countries集合挂载快照监听器:
- 收到
DocumentChange.Type.REMOVED类型的变更事件时,直接删除本地对应ID的缓存数据即可。注意在Fragment退到后台/销毁时及时移除监听器,避免产生不必要的长连接和读成本。
内容的提问来源于stack exchange,提问作者Taha Sami
相关产品推荐
相关产品推荐

