如何实现Firebase应用离线存储数据,联网后自动上传至云端?
问题排查与修复方案
以下是针对你当前离线持久化不生效问题的排查点和修复方案:
- 首先检查自定义Application是否在清单文件注册
你自定义了PhoNoteApplication类开启持久化,但绝大多数这类问题都是忘了在AndroidManifest.xml的<application>标签添加注册属性,需要补充:<application android:name=".PhoNote" <!-- 其他原有配置保持不变 --> > <!-- 原有四大组件配置 --> </application> - 修复提交逻辑的回调阻塞问题
你当前的代码逻辑是必须等setValue的OnSuccessListener触发才会关闭进度条、跳转页面,但离线状态下,OnSuccessListener只有数据真正同步到Firebase服务端才会触发,所以离线提交时会出现进度条一直转圈的情况,你误以为持久化没生效,实际上本地已经缓存了写操作,网络恢复后会自动上传。
调整方案:调用setValue后立刻关闭进度条、提示提交成功、跳转到列表页,不需要等待服务端回调。如果需要感知数据是否同步到服务端,可以额外添加状态监听,不要阻塞用户正常操作。 - 修正日期校验逻辑
你当前的判断逻辑写反了:if (notValidDateFormat(...) || ...)才走提交逻辑,等于只有日期格式不合法的时候才会提交数据,日期格式合法反而会提示无效,把判断条件调整为合法日期才走提交逻辑即可。 - 优化批量更新的写法
你修改数据时分了5次单独调用setValue,建议合并为一次批量提交,减少不必要的回调和写操作:Map<String, Object> updateMap = new HashMap<>(); updateMap.put("modifiedTime", new Date().getTime()); updateMap.put("date", binding.editDate.getText().toString()); updateMap.put("name", binding.editName.getText().toString()); updateMap.put("weight", weight); updateMap.put("rate", rate); database.getReference().child("Users").child(FirebaseAuth.getInstance().getUid()).child("data_added_by_user").child(mintent.getStringExtra("id")) .updateChildren(updateMap) .addOnSuccessListener(unused -> { // 服务端同步成功的额外逻辑,不需要可以去掉 }); - 额外说明:
keepSynced主要针对读数据的自动同步场景,你需要的离线写缓存功能,只要开启了磁盘持久化就默认支持,不需要额外给路径开keepSynced也能正常工作。
内容的提问来源于stack exchange,提问作者Prabesh Regmi
相关产品推荐
相关产品推荐

