android - 将移动应用程序中的离线数据同步到服务器时避免重复
问题描述
我们有一个移动应用程序。有一个销售模块。它调用 sales rest api 来创建销售订单。
销售 api POST 请求的格式:
//server generates primary key. there is no support for request id currently
{
"customer_id" : 1,
"items" : [
{ "item_id" : 123 },
{ "item_id" : 456}
],
"store_id" : 10,
"sale_time" : "2019-10-01 13:45:01"
}
由于我们必须支持离线模式,所有销售都将存储在设备本地,当互联网连接可用时,它将与服务器同步。
但是我知道,如果互联网连接很差,http 库可以多次重试 http 请求。但这可能会导致在服务器上创建多个销售条目。
鉴于服务器(rest api)为新记录生成主键,如何正确实现离线数据同步?更新现有记录很好,因为它具有服务器生成的主键,但是如何处理没有主键的新记录?
设想:
- 应用处于离线模式
- 用户创建销售订单并在本地保存
- 一段时间后,假设互联网连接有限。
- 应用程序获取所有尚未同步的记录并为每个记录调用 rest API。
- 为第一条记录调用了销售休息 API,应用正在等待响应。
- 互联网连接失败,但服务器创建记录并未能通知应用程序
- 几分钟后说互联网连接恢复,现在应用程序尝试再次调用销售 api 以获取第一条记录并收到成功响应。但是服务器中有两个条目。
如何解决这个问题?
解决方案
2种方法来处理这个
1)使用同步状态
当您将数据存储在存储中时,再添加一个标志作为“同步状态”,数据类型将为布尔值,默认为 false。并且只获取那些同步状态为假的数据。如果数据成功发送到服务器更改状态为真。
2)服务器同步日期时间
如果您的服务器向您发送同步日期时间,那么这将是可能的,您需要检查服务器同步日期时间之后的日期,只有您需要与服务器同步数据
推荐阅读
- javascript - 打开 pdf 文件时启用旋转
- sql - 如何从 oracle PL/SQL 集合中选择所有行到 SYS_REFCURSOR
- python - 获取结果时 pyodbc 到 SQL Server 的速度太慢
- java - 如何将 javac 与 jars 和包一起使用
- python - 如何使用python根据通用标识符合并2个excel电子表格?
- java - 如何将数据附加到 Gson JsonObject 中的属性?
- c# - 在 Entity Framework DB First .Net 应用程序中放置 CRUD 功能的位置
- javascript - 使用 javascript 显示选定复选框的列表
- apache-spark - 在 docker 堆栈之间共享卷?
- xml - 将 XML starlet 定位为仅命中顶级元素以下的元素