Flutter闪卡应用:本地与服务器数据迁移及合并展示最佳实践
本地与网络词汇数据合并展示的最佳实践
1. 给数据打标识,做好基础分类
给每条词汇添加来源标记(比如local/server)和唯一ID,同时加last_modified字段记录最后修改时间:
- 本地自定义词汇用本地生成的UUID或自增ID,服务器词汇直接用后端返回的唯一ID
- 不管是本地编辑还是服务器更新,都同步更新
last_modified,这是后续冲突判断的核心依据
2. 先展示本地,再后台同步补全
- 应用启动时优先加载本地数据库,快速展示用户的自定义词汇,避免空白等待,保障基础体验
- 后台异步请求服务器数据,拿到数据后再做合并操作:
- 服务器新词汇(本地无对应ID):直接加入数据集
- ID重复的词汇:对比
last_modified,谁更新晚就用谁的版本;如果是本地和服务器都做了修改,给用户弹窗确认选择保留版本
3. 高效合并的实现逻辑
用**哈希表(字典)**做快速匹配,避免循环遍历的低效:
# 本地数据转成ID为键的字典 local_vocabs = {vocab.id: vocab for vocab in get_local_vocabs()} # 请求服务器数据 server_vocabs = fetch_server_vocabs() # 合并逻辑:优先保留本地,再根据时间戳更新/添加服务器数据 for vocab in server_vocabs: if vocab.id in local_vocabs: # 服务器版本更新更晚,替换本地数据 if vocab.last_modified > local_vocabs[vocab.id].last_modified: local_vocabs[vocab.id] = vocab else: # 新增服务器词汇 local_vocabs[vocab.id] = vocab # 转成列表用于展示,可按用户习惯排序(如添加时间、字母顺序) merged_vocabs = list(local_vocabs.values())
4. 冲突处理要人性化
- 对于本地和服务器都修改过的词汇,不要直接覆盖:展示两边的差异(比如本地释义VS服务器释义),给用户三个选项:保留本地、保留服务器、手动编辑合并
- 允许用户标记部分本地词汇为**「不参与服务器同步」**,这类词汇永远优先展示本地版本,不被服务器数据覆盖
5. 展示层的状态提示
- 同步中:在页面边缘显示弱提示(比如「正在同步服务器词汇...」),不遮挡核心内容
- 同步完成:短暂提示「新增X个词汇,更新Y个词汇」,让用户感知变化
- 网络异常:提示「无法同步服务器数据,当前仅展示本地词汇」,并提供重试按钮
6. 合并后持久化更新本地数据
把最终合并后的数据集更新到本地数据库,下次启动直接加载最新合并数据,无需重复合并(除非用户主动触发同步)
内容的提问来源于stack exchange,提问作者dokind
相关产品推荐
相关产品推荐

