当前项目遇到一个需求 多个android sqlite客户端的数据要保持和服务端的sqlite数据保持一致(即不考虑客户端的自主修改数据,只考虑当服务端数据跟新时所有客户端数据要和服务端数据保持一致)
看了很多文章,得到的结果都是使用版本号来控制。但是版本号控制在数据更新频繁的情况下会有太多版本比较麻烦
所以想了以下思路来保证客户端 的数据 根据服务端数据做增量更新
客户端服务端sqlite表设计如下
建表语句
create table client(id int primary key,content char,status int,time_up TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);
id
content
status
time_up
自增字段
字段内容
状态
0:正常 1:删除 2修改
最后操作时间戳
假设客户端初始数据如下
id
content
status
time_up
1
XXX
0
10
2
aaaa
0
20
服务端初始数据如下
id
content
status
time_up
1
XXX
0
10
2
aaaa
0
20
每次客户检查更新时获取3个数据来检查是否需要更新
1.检查是否有新增数据
select * from client where status=0 order by strftime('%s',time_up) desc limit 1;
改语句返回ID为2的记录
2.检查是否有数据删除 这里的删除用软删除(做个标记方便之后恢复)
select * from client where status=1 order by strftime('%s',time_up) desc limit 1;
这里返回空记录
3.检查是否有数据修改
select * from client where status=2 order by strftime('%s',time_up) desc limit 1;
这里返回空记录
向服务器发送的参数可以拼接为
add=20为 检查新增语句获取到的最新时间戳 up 和del 本地无数据所以发送0 通知服务器不做处理
XXX?add=20&up=0&del=0
服务端操作
获取到
add=20
up=0
del=0
3个参数后分别做相应操作 下面例子$表示引用
检查新增
select * from client where status=0 and strftime('%s',time_up)>$add
检查删除
select * from client where status=1 and strftime('%s',time_up)>$up
检查修改
select * from client where status=2 and strftime('%s',time_up)>$del
获取到的结果为所有客户端需要更新的结果集
如上图数据 客户端和服务端数据一致情况下 3条语句返回空结果 ,不需要更新
重点在下面 服务端的增删改操作
当服务器新增数据时status 设置为0 time一样为当前时间
某条数据被修改时把status 设置为2 time为修改时间
删除数据时候 status 设置为1 time 为修改时间
例如
对服务器数据进行增删该后数据如下
id
content
status
time_up
1
XXX-del
1
30
2
aaaa-up
2
40
3
newxxx
0
50
服务端数据改变 而客户端数据未变动的情况下 服务端再次执行检查语句
检查新增
select * from client where status=0 and strftime('%s',time_up)>$add
获取到记录3
检查删除
select * from client where status=1 and strftime('%s',time_up)>$up
获取到记录2
检查修改
select * from client where status=2 and strftime('%s',time_up)>$del
获取到记录1
把获取到的记录 返回语句 或者 json(看个人情况)给到客户端
这样就可以分别检查新增 删除 修改的3个数据了
欢迎各位大佬发表看法