React Native应用本地SQLite存储与线上服务器数据同步及标记实现问询
调研信息采集工具离线数据同步实现方案
1. 本地SQLite同步标记字段设计
首先在本地存储表单数据的表中新增以下核心字段,用于维护同步状态:
record_id:本地记录唯一主键,自增即可,无需和后端ID绑定enterprise_id:关联企业ID,用于定位归属企业form_page_num:表单页码(取值1-5,对应拆分的5个页面),和enterprise_id组合即可唯一标识某家企业的某一页表单数据sync_status:同步状态枚举,默认值为0:0= 待同步1= 同步成功2= 同步失败(非网络原因的错误,比如参数非法、权限不足)
update_time:当前页数据最后修改时间戳,用于解决云端和本地的数据冲突form_data:当前页100个输入项的序列化内容,建议用JSON格式存储
每次点击保存按钮时,若当时联网且同步到后端成功,直接将sync_status设为1;如果无网络或者同步接口请求失败,sync_status保持为0即可。
2. 网络恢复后的同步执行逻辑
- 首先在应用全局注册网络状态监听回调,只要监听到网络从不可用切换为可用状态,就自动触发后台同步任务,注意同步任务必须放在子线程执行,避免阻塞UI交互。
- 同步任务启动后,先从本地SQLite查询所有
sync_status = 0的记录,按update_time升序排列,保证先修改的数据先同步,避免后提交的数据覆盖旧数据。 - 逐条取出待同步记录,调用后端同步接口,将
enterprise_id、form_page_num、form_data、update_time作为请求参数传给后端。- 接口返回成功:将当前记录的
sync_status更新为1 - 接口返回业务错误(比如参数错误、企业不存在):将当前记录的
sync_status更新为2,可同时记录错误日志便于排查 - 接口因网络波动请求失败:不修改
sync_status,等待下一次同步触发时自动重试
- 接口返回成功:将当前记录的
- 冲突处理逻辑:后端收到同步请求后,先查询当前
enterprise_id+form_page_num对应云端数据的最后更新时间,若前端传的update_time晚于云端时间,直接覆盖云端数据;若云端时间更新,可根据业务需求选择返回冲突提示让用户选择保留版本,或者默认按时间最新的版本覆盖。
3. 你描述场景的适配效果
对应你举的具体场景,本地数据库会生成以下状态的记录:
- 企业A的第1、2页:
sync_status = 1(联网保存时已同步成功) - 企业A的第3、4、5页:
sync_status = 0(离线保存未同步) - 企业B的2个填写过的页面:
sync_status = 0(离线保存未同步)
网络恢复触发同步后,会按保存时间顺序先同步企业A的3个待同步页面,再同步企业B的2个待同步页面,所有页面同步成功后对应的sync_status都会更新为1,整个同步流程完成。
4. 可选优化点
- 对于
sync_status = 2的失败记录,可增加最多3次自动重试机制,超过重试次数再提示用户手动处理 - 同步过程中可在UI角落增加弱提示(比如顶部小横幅、同步中图标),让用户感知到数据正在上传
- 对于
sync_status = 1的已同步记录,可定期清理超过30天的历史数据,避免本地数据库占用过多存储空间
内容的提问来源于stack exchange,提问作者STBox
相关产品推荐
相关产品推荐

