Android客户端与服务器端数据库同步
应用场景
假设我们在做一个通讯录软件,我们可以在多个客户端对服务端的数据进行增删改。那么这篇文章中我们要解决的问题是如何在客户端与服务端只传输经过增删改操作的数据,来使得客户端与服务端的数据是同步的。
名词解释
Anchor:同步锚点,用时间戳来表示,用来发现两端数据变化的部分
客户端表设计
每条记录包含两个用来同步用的字段:
status : 用来标识记录的状态
anchor : 记录服务端同步过来的时间戳
anchor | 含义 |
---|---|
0 | 本地新增 |
-1 | 标记删除 |
1 | 本地更新 |
9 | 已同步 |
服务端表设计
modified : 服务端修改记录的时间戳
双向同步过程
初始状态下,我们假设客户端和服务端的表各有两条数据
客户端:
id | name | phone | status | anchor |
---|---|---|---|---|
1 | Ken | 18612345678 | 9 | 2 |
2 | Jim | 13888888888 | 9 | 3 |
服务端:
id | name | phone | modified |
---|---|---|---|
1 | Ken | 18612345678 | 2 |
2 | Jim | 13888888888 | 3 |
此时,客户端与服务端的数据是完全同步好了的
Client增加1条记录
id | name | phone | status | anchor |
---|---|---|---|---|
1 | Ken | 18612345678 | 9 | 2 |
2 | Jim | 13888888888 | 9 | 3 |
3 | Tim | 12345678 | 0 | 0 |
Client修改1条记录
id | name | phone | status | anchor |
---|---|---|---|---|
1 | Ken | 18612345678 | 9 | 2 |
2 | Jim | 010-12345678 | 1 | 3 |
3 | Tim | 12345678 | 0 | 0 |
注:因为上面的数据不是从服务端同步过来的,所以anchor默认为0
Client发送本地更新
SELECT * FROM table WHERE status < 9
- 1
客户端执行上面的SQL语句,找出客户端需要同步到服务端的记录。通过网络串行的发送给服务端。上一条请求没有得到回应的话,就不能进行下一个请求。
下表中的数据是发送的同步消息
id | name | phone | status | anchor |
---|---|---|---|---|
2 | Jim | 010-12345678 | 1 | 3 |
3 | Tim | 12345678 | 0 | 0 |
Server处理同步消息
服务端串行的收到客户端发送过来的数据,首先处理第一条数据
id | name | phone | status | anchor |
---|---|---|---|---|
2 | Jim | 010-12345678 | 1 | 3 |
服务端收到请求后需要对比客户端的anchor和服务端的modified,只有服务端modified=客户端anchor才能继续同步,否则说明客户端在上一次同步后服务端更新过数据,需要解决冲突后才能继续,接着根据status的值为1,那么服务端执行UPDATE语句
UPDATE table SET (name, phone) VALUES (?, ?) WHERE id = ?
- 1
其次,处理第二条数据
id | name | phone | status | anchor |
---|---|---|---|---|
3 | Tim | 12345678 | 0 | 0 |
如果得知anchor = 0,直接执行INSERT 语句
INSERT INTO table (id, name, phone) VALUES(?, ?, ?)
- 1
服务端经过这两次操作后,数据表如下
id | name | phone | modified |
---|---|---|---|
1 | Ken | 18612345678 | 2 |
2 | Jim | 010-12345678 | 6 |
3 | Tim | 12345678 | 8 |
Client根据响应更新本地记录
服务端处理完数据后,还要响应客户端的请求,如下
id | status | anchor |
---|---|---|
2 | 9 | 6 |
3 | 9 | 8 |
收到响应后,客户端就开始执行UPDATE了
UPDATE table SET status = ?, anchor = ? WHERE id = ?
- 1
客户端现在的数据表如下:
id | name | phone | status | anchor |
---|---|---|---|---|
1 | Ken | 18612345678 | 9 | 2 |
2 | Jim | 010-12345678 | 9 | 3->6 |
3 | Tim | 12345678 | 9 | 0->8 |
Server增加一条数据并更新一条数据
id | name | phone | modified |
---|---|---|---|
1 | Ken | 00000000 | 11 |
2 | Jim | 010-12345678 | 6 |
3 | Tim | 12345678 | 8 |
4 | Bill | 88888888 | 10 |
Client向Server请求数据
因为服务端modified字段代表的是时间戳,所以Max(anchor)表示客户端最近一次同步的时间,如果存在服务端modified > Max(anchor),说明服务端需要向客户端同步数据。
服务器端执行下面的SQL语句:
SELECT * FROM table WHERE modified > Max(anchor)
- 1
返回下表中的数据:
id | name | phone | modified |
---|---|---|---|
1 | Ken | 00000000 | 11 |
4 | Bill | 88888888 | 10 |
Client处理同步消息
客户端根据增量数据更新本地表,处理数据时,只能更新状态为已同步或者不存在的数据
id | name | phone | status | anchor |
---|---|---|---|---|
1 | Ken | 00000000 | 9 | 2->11 |
2 | Jim | 010-12345678 | 9 | 6 |
3 | Tim | 12345678 | 9 | 8 |
4 | Bill | 88888888 | 9 | 10 |
客户端删除记录
逻辑删除记录
id | name | phone | status | anchor |
---|---|---|---|---|
1 | Ken | 00000000 | -1 | 15 |
2 | Jim | 010-12345678 | 9 | 6 |
3 | Tim | 12345678 | 9 | 8 |
4 | Bill | 88888888 | 9 | 10 |
客户端发送消息到服务端
根据status < 9,将逻辑删除的记录发送至服务端,服务端收到消息后,将该记录移至deleted_table(相当于时光机,以后可以进行数据的恢复)表中
id | name | phone | modified |
---|---|---|---|
1 | Ken | 00000000 | 16 |
服务端响应客户端的请求
id | status | anchor |
---|---|---|
1 | -1 | 16 |
客户端收到响应
客户端直接进行物理删除
服务端删除记录
如果客户端从服务端获取的增量信息中包含删除记录的消息,则客户端直接进行物理删除
Android客户端与服务器端数据库同步相关推荐
- 一个简单的Android客户端从服务器端获取json数据并解析的实现代码
今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码代码如下: /** ...
- Android 客户端与服务器端进行数据交互(一、登录服务器端)
概要 安卓APP要实现很多功能(比如登录注册.发表评论等)时都必须要使用到网络数据交互.所以在学习了这部分内容后,就将其以最常见的登录过程为例整理出来,也方便跟我一样的新手能迅速学习上手. 预期效果图 ...
- Android客户端与服务器端socket通讯
Android客户端与服务器端的Socket通讯: socket通讯依赖IP地址和端口号,每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 服务器端代码: 实例化主类, ...
- Android客户端请求服务器端的详细解释(附源代码)
Android客户端请求服务器端的详细解释 1. Android客户端与服务器端通信方式: Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和po ...
- android客户端从服务器端获取json数据并解析的实现代码
2019独角兽企业重金招聘Python工程师标准>>> 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 代码如下: /** * 从指定的URL中获取 ...
- Socket编程(Android客户端+PC服务器端)
一个多月没有写东西了,感觉像过了一个暑假...废话不多说了,今天来记录一下这两天学习Socket的内容.按照我研究思路来进行一步步的深入Socket. 一.什么是Socket 网络上的两个程序通过一个 ...
- Android 客户端与服务器端时间校准
开发app时发现APP显示的时间不准,或者说APP时间与服务器时间不一致,会导致数据请求.数据显示等各种问题.这时候我们就需要一种机制来解决时间不一致的问题. 第一个解决方法: 服务器端永远使用UTC ...
- Android 客户端与服务器端交互实现登录功能
思路: 安卓客户端输入账号和密码,使用 okHttp 向服务器端发送请求并传递输入的账号和密码,服务器端的登录接口查询数据库,判断是否能登录成功,然后返回给客户端JSON字符串,客户端使用Gson解析 ...
- Android客户端与服务器端交互,如何保持session回话
前言 最近在开发项目的过程中,遇到Android与web服务器要在同一session下通信的问题. 一.Session与Cookie的共性与区别: ①.共性 Cookie和Session都为了用来保存 ...
最新文章
- 42. fastjson处理下划线和驼峰问题的方法和源码分析
- Docker 概念详解
- elementUI的table组件实现setCurrentRow的滚动条定位效果
- 文巾解题 13. 罗马数字转整数
- 区块链技术实现只需180行go代码!
- 陝西省2021年高考成绩查询,2021年高考陕西省各批次录取分数线预测,你会感到意外吗?...
- java框架白话_Java NIO框架Netty教程(二) 白话概念
- elk docker
- 复制过去格式不一样_不一样的立春节气:一个新的轮回开启,万物更新,疫情终将过去...
- 【转】C++从零实现神经网络
- 启动zabbix server服务
- 将文字或txt转换成GBK或者UTF8编码
- linux 监听 ipv6,zabbix 监控 ipv6
- 视频倒立解决方法/USB 视频设备ID:USB\VID_13D3PID_5130MI_00\621DA5E0900000
- 用PS快速给图片添加逼真彩虹效果
- win10笔记本自带蓝牙连接xbox one s无线手柄(也适用于耳机等蓝牙设备)
- mysql命令大全(转)
- 域名抢注时要注意什么?域名抢注要知道什么?
- Python编程:从入门到实践(基础知识)
- python爬虫怎么赚钱-小哥用Python兼职月入过万,用Python做项目有多赚钱
热门文章
- 如何在CentOS 7上安装Apache Kafka
- 3 photolemur 样式_Photolemur 3 v1.1.0 for Mac 照片增强工具
- twitch 亚马逊云_如何断开您的Twitch帐户与Amazon Prime的连接
- 用python画漂亮的生日蛋糕_分享7款简单易学的生日蛋糕,好看又好吃,学会后,再也不用买...
- 新东方雅思词汇(List 31~ List 35)
- 2023金3银4求职季,APP面试题放送(建议收藏)
- Android修改应用程序图标
- 十大免费CMS建站系统介绍(PHP+MYSQ…
- 雅虎军规前端35条优化(css部分 js部分 图片 cookie 移动端 服务器)
- WhatsApp Business账户被封?常见封号原因解析(附防封指南)