如何将Room Database备份至Firebase Realtime Database并实现数据恢复
方案选型建议
不建议弃用Room或者全量上传数据库到Firebase,你当前只有1个字段需要修改,优先选增量同步修改字段的方案,改造成本最低,也符合Firebase的使用逻辑,同时能节省存储和带宽成本。
增量同步方案(最优)
核心逻辑:你放在assets里的基础数据库所有用户通用,每个用户只需要存储自己修改过的条目对应的主键+修改的单个字段值即可,不需要存储全量数据。
上传数据到Firebase流程
- 先给你的Room实体类加个
isModified布尔字段,默认值为false,只要用户修改了对应条目的可编辑字段,就将该条目的isModified设为true - 触发同步时机(比如修改完数据、应用退到后台、用户手动触发同步)时,用Room查询所有
isModified = true的条目,仅提取条目的主键ID和待修改的目标字段组装为Map结构 - 将该Map写入Firebase Realtime Database对应用户的节点下,节点路径可设为
/user_modifications/{用户uid}/,子节点的key为条目的主键ID,value为修改后的字段值 - 上传成功后可将这些条目的
isModified改回false,避免重复上传
从Firebase拉取恢复本地数据流程
- 应用首次安装、本地数据库初始化完成(即从assets复制完基础库之后,先请求Firebase对应用户的
user_modifications节点拉取所有修改记录 - 遍历拉取到的所有修改记录,根据主键ID找到本地Room里对应的条目,更新对应字段值即可
- 应用运行过程中也可以监听该节点的变动,实时同步修改本地Room数据,可直接实现多设备同步能力
全量Room数据库文件同步方案(不推荐,仅作参考)
如果确实要同步整个Room数据库文件的话也可实现,但性价比极低,Firebase Realtime Database不适合直接存储二进制大文件,实在要做可以转成Base64字符串处理:
上传流程
- 找到本地Room数据库文件路径,一般为
/data/data/你的应用包名/databases/你的room数据库名.db - 读取该文件的字节流,转成Base64编码的字符串
- 将该字符串存储到Firebase对应用户节点下的
room_db_backup字段内
拉取替换流程
- 从Firebase拉取到Base64字符串,转回字节流
- 先关闭当前正在使用的Room数据库实例,避免出现文件锁报错
- 将字节流写入到本地Room数据库的路径下,覆盖原有文件
- 重新初始化Room数据库实例即可
常见疑问解答
- 是否需要为每个用户存储完整数据库副本?
完全不需要,基础库所有用户通用,每个用户仅存储自己修改的部分即可,能节省99%以上的存储空间,同步速度更快,出错概率也更低。 - 是否需要修改大量现有代码?
增量同步方案仅需要新增同步逻辑,原有Room的增删改查代码完全不需要改动,改造成本极低。
内容的提问来源于stack exchange,提问作者Edward Aarma
相关产品推荐
相关产品推荐

