如何实现SQLite数据库与Firebase的可选同步及离线变更同步
SQLite+可选Firebase同步方案核心实现步骤
1. 本地SQLite基础改造
- 为所有需要跨端同步的业务表新增4个系统字段:
sync_status:枚举值,标记记录同步状态,分为unsynced(未同步)、synced(已同步)、conflict(同步冲突)三类last_modified:毫秒级时间戳,记录记录最后一次在本地被修改的时间firebase_doc_id:字符串类型,存储对应Firebase端的文档ID,未同步过的记录该字段为空is_deleted:布尔值,所有删除操作走软删除逻辑,不直接物理删除记录,避免离线删除后丢失待同步凭据
- 本地原有增删改逻辑完全保留,所有写操作执行完成后,自动将对应记录的
sync_status更新为unsynced、刷新last_modified为当前时间,整个过程不依赖网络或Firebase登录状态,保证纯离线模式的使用体验和原有逻辑完全一致。
2. 双模式状态管理
- 提供显式的模式切换入口:应用默认启动即进入纯离线SQLite模式,不主动弹出任何注册、登录引导,仅当用户主动点击「开启多端同步」功能入口时,才拉起Firebase Auth的注册/登录流程;用户随时可以主动退出Firebase登录切回纯离线模式,退出操作不会删除本地任何已存的SQLite数据。
- 全局注册两个常驻监听:Firebase Auth登录状态监听、设备网络连通状态监听,仅当两个条件同时满足(已登录有效Firebase账号 + 设备连接可用网络)时,才自动触发同步流程,其余状态下不发起任何Firebase相关网络请求。
3. 双向同步逻辑实现
- 本地同步触发时机覆盖三个场景:应用冷启动完成、Firebase登录状态从退出变为已登录、网络状态从断连变为连通。触发后首先扫描本地SQLite中所有
sync_status为unsynced的记录,按照last_modified从早到晚排序组成待推送队列,按批次推送到Firebase对应用户的私有数据集合。 - 单条记录推送成功后,将Firebase返回的文档ID写入本地记录的
firebase_doc_id字段,更新sync_status为synced;如果是被标记is_deleted的软删记录,推送成功后再对本地记录做物理删除。 - 本地推送完成后,拉取云端上次同步时间戳之后的增量变更数据,和本地记录做匹配比对:
- 本地无对应
firebase_doc_id的记录,直接写入本地SQLite,标记为synced - 本地有对应记录的,比对两边
last_modified时间戳:云端时间更新则用云端字段覆盖本地,本地时间更新则将本地记录重新加入待推送队列回传云端 - 两边修改时间差小于预设阈值(比如2秒)且核心字段内容不一致,标记为
conflict状态,可按业务规则选择默认保留最新版本,或提示用户手动选择保留内容。
- 本地无对应
4. 边界场景兼容
- 同步过程中如果出现网络中断、登录凭证失效,直接终止当前同步任务,已经推送成功的记录保留
synced状态,未完成推送的记录保持unsynced标记,等下次满足同步触发条件时从断点位置继续执行,避免重复推送已同步数据。 - 给每个用户在本地和云端都存储
last_sync_time字段,每次同步只拉取该时间点之后的增量数据,不做全量拉取,减少流量消耗和同步等待时长。 - 纯离线模式下直接阻断所有Firebase SDK的相关调用,保证未开启同步功能的用户,应用后台不会运行任何Firebase相关进程,不额外占用内存和流量。
内容的提问来源于stack exchange,提问作者nano tech
相关产品推荐
相关产品推荐

