首页 新闻 会员 周边

安卓本地数据库与服务器数据同步

0
悬赏园豆:100 [已解决问题] 解决于 2017-05-11 13:48

需求: 在断网情况下app能用,有网的时候将本地数据库同步到服务器上面去。

各位大神,能给个研究方向吗

zeroonec的主页 zeroonec | 初学一级 | 园豆:59
提问于:2017-01-12 13:47
< >
分享
最佳答案
1

看了一下,主要几个问题:

1.数据存在本地

2.数据修改需要上传到服务器

3.上传服务器时,用户多 服务器压力会不会很大

第一个问题不用说,超简单的

第二个问题,你在本地多一张表,这张表存放你对数据的操作记录,删除了哪条,增加了哪条都在这张表里能查到

然后写好上传代码。在有网情况下将操作记录发给服务器。

第三个问题,不是服务器压力大,是数据库压力大。数据库和服务器能提供多少连接是固定的,服务器处理数据时非常快,但数据库就没那没么理想了。那么就有两种方法。

1.数据库读写分离

2.消息队列来异步处理。当然,用简单的列表来做异步也是可以,后台写一个处理的程序来消费列表里面的操作记录。

收获园豆:100
盟怀部孩 | 小虾三级 |园豆:878 | 2017-01-13 09:39

你好,非常喜欢你这么清晰的回答,但是这里还有好多小细节要处理。

1. 现有数据库这种操作太多了,一个一个的添加太麻烦,由于开发人员的写法不同,有些使用的是原生态的写法,有些直接写SQL语句,导致没一个好的标准来处理操作记录。 在这里找到了触发器,不知道是否可以解决这个问题,我在http://sqlite-sync.com/ 看到了这个希望。 (目前来说唯一的希望了额)

2. 删除,新增这俩个非常好处理,但是更新操作,想精简点,实在是自家的服务器,每一分资源都要好好利用。

不知有没有更好的思路,仍在查找答案中。

zeroonec | 园豆:59 (初学一级) | 2017-01-13 10:05

@Nice_cj_com: 同样的,你程序的层次架构应该分明,业务层做什么,数据层做什么。

业务层负责业务逻辑处理,里面不可以出现一句SQL代码

数据层再来做SQL拼接。

我的意思能明白?就是增删改,在业务层,都是数据对象,没有SQL的关系。所有需要进入数据库的操作都交给数据层来做。

 

就这个问题,你本地存的记录,应该是这样子的

时间|操作类型|ID|数据内容json

这样服务器取到之后,增删改业务都很明确。并且,在服务器接收了操作记录就清空本地操作记录或者标记,下次不再提交以前的记录。

 

触发器在这个问题上面并没有好的利用之地。

另外,你这个项目是维护,还是还没开发?

盟怀部孩 | 园豆:878 (小虾三级) | 2017-01-13 10:17

@盟怀部孩: 你好,属于升级维护,老系统了,数据层代码多,有80个Activity,而且纯DB开发的库存系统,一个一个的在原有的基础上添加操作记录实在是不合理。现在就这一个问题,怎么添加操作记录了。

zeroonec | 园豆:59 (初学一级) | 2017-01-13 10:25

@Nice_cj_com: 升级维护就蛋疼了。可能你前期没有设计好架构。

添加操作记录问题也不大,只是本地行为。相当新增了一个接口功能而已。服务器只要提供一个处理这些操作记录的服务即可,就是这个提供服务的怎么做处理会让你蛋疼些。

盟怀部孩 | 园豆:878 (小虾三级) | 2017-01-13 10:28

@Nice_cj_com:

还有另一个思路

APP上面比较简单,只是在修改数据的时候加个记录,将SQL串记录下来就可以。

然后将SQL串提交给服务器,让服务器来处理这些SQL

盟怀部孩 | 园豆:878 (小虾三级) | 2017-01-13 10:34

@盟怀部孩: 你好,这个Sqlite和Mysql不大一致,需要转换,而且考虑到未来的拓展性,也有可能换Oracle,MongDB这样的,还是在本地做,在发送数据给服务器之前需要筛选掉一些东西,总的来说现在一个问题了,那就是如何在这老的系统做一个接口来进行添加操作行为了。 谢谢你 :)

zeroonec | 园豆:59 (初学一级) | 2017-01-13 10:39

@Nice_cj_com: 不客气,祝你早日实现功能,运行正常,老板赏识,步步高升,迎娶百富美,出任CEO,走向人生巅峰

盟怀部孩 | 园豆:878 (小虾三级) | 2017-01-13 11:03
其他回答(2)
0

做本地缓存技术,可以看看DiskLruCache

大师兄丶 | 园豆:843 (小虾三级) | 2017-01-12 15:59

app所有的操作数据都存在Sqlite里面,隔一段时间进行上传,只上传改变的部分,缓存的话不知道怎么实现,说说简单的思路。

支持(0) 反对(0) zeroonec | 园豆:59 (初学一级) | 2017-01-12 16:30
0

Sqlite 定时上传数据到服务器,服务器通过时间判断上传的数据是否最新,是则更新服务器数据,否则忽略

大佬辉 | 园豆:261 (菜鸟二级) | 2017-01-13 08:39

你好,这里有个问题,考虑到客户端有点多,这样做会导致服务器压力很大。

支持(0) 反对(0) zeroonec | 园豆:59 (初学一级) | 2017-01-13 08:42

@Nice_cj_com: 那上消息队列,数据排队进来

支持(0) 反对(0) 大佬辉 | 园豆:261 (菜鸟二级) | 2017-01-13 08:43

@大佬辉: 你好,那如何上传那些修改的数据呢,还有,如何删除掉的数据如何上传提示服务器删除呢?

支持(0) 反对(0) zeroonec | 园豆:59 (初学一级) | 2017-01-13 08:46

@Nice_cj_com: 本地做一个中间表存储,通知服务器删除那个表的哪些主键

支持(0) 反对(0) 大佬辉 | 园豆:261 (菜鸟二级) | 2017-01-13 08:47

新增编辑同理,注意加上时间,好与服务器的数据里面的时间对比

支持(0) 反对(0) 大佬辉 | 园豆:261 (菜鸟二级) | 2017-01-13 08:48

@大佬辉: 你好,在旧有的基础上,原来每个删除,新增,编辑操作都需要这样额外添加一条SQL语句,同样在新增和编辑时需要将本地数据发送到服务器做对比,这样做会不会很耗时,我总觉得思路应该是有一个基于数据库层的类似于JavaEE的AOP,在中间做拦截和分析,将那一部分改动的数据上传到数据库中,这样精准又不会修改现有的代码。

支持(0) 反对(0) zeroonec | 园豆:59 (初学一级) | 2017-01-13 09:02

@Nice_cj_com: 原理都差不多,都是传数据,对比及处理

支持(0) 反对(0) 大佬辉 | 园豆:261 (菜鸟二级) | 2017-01-13 09:07

@大佬辉: 你好,触发器可以解决这样的问题吗?我对这个不是很了解

支持(0) 反对(0) zeroonec | 园豆:59 (初学一级) | 2017-01-13 09:14

@Nice_cj_com: 不建议用,会死锁

支持(0) 反对(0) 大佬辉 | 园豆:261 (菜鸟二级) | 2017-01-13 09:15

@大佬辉: 你好,那关于底层的C调用,这方面研究怎么样?

支持(0) 反对(0) zeroonec | 园豆:59 (初学一级) | 2017-01-13 09:23

@Nice_cj_com: 暂无

支持(0) 反对(0) 大佬辉 | 园豆:261 (菜鸟二级) | 2017-01-13 09:23

@大佬辉: 谢谢你 :)

支持(0) 反对(0) zeroonec | 园豆:59 (初学一级) | 2017-01-13 10:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册