如何在移动客户端数据库和服务器mysql数据库之间正确实现数据同步

时间:2015-03-11 21:48:03

标签: android mysql sqlite spring-boot data-synchronization

我开发了一个Android应用程序,允许用户记录某些活动。我现在想要添加一个功能,用户可以将数据备份到服务器,这样如果他们有多个设备,他们就可以从中下载。

我开始研究基于Spring-Boot的Web应用程序。这将是纯粹的json,不会有web-ui。

我遇到了关于主键和外键的问题。例如,我在服务器上有这个表。

CREATE TABLE user_activities (
  id INT AUTO_INCREMENT
, user_id INT
, activity_date DATETIME
, notes TEXT
, PRIMARY KEY (id)
);

此表位于客户端上的SQLite上。

CREATE TABLE user_activities (
  id INT AUTO_INCREMENT
, user_id INT
, activity_date LONG
, notes TEXT
);

当用户离线创建活动记录时,它将生成主键。当用户上线时,我将通过执行httpPost来同步数据。但是,我无法使用生成的ID,因为它可能会导致重复的问题。

我可以使用哪种方法?

感谢任何帮助。

更新1

确定。所以根据Jorge Moreno和nuuneoi的评论,我想出了这个设计。

更新2

在查看设计之后,我可能错过了客户端的专栏。那里也添加了device_id列。

我认为local_id可能在用户设备上相似,因此添加device_id将无法使用device_id和local_id来获得类似的值。

服务器

CREATE TABLE user_activities (
  id INT AUTO_INCREMENT
, device_id VARCHAR(100) -- Actual Devices Id (e.g. Phone, Tablet). To handle if a user has multiple devices
, local_id INT
, user_id INT
, activity_date DATETIME
, notes TEXT
, PRIMARY KEY (id)
);

客户端

CREATE TABLE user_activities (
  id INT AUTO_INCREMENT
, user_id INT
, device_id TEXT -- Added on UPDATE 2
, activity_date LONG
, notes TEXT
);

感谢任何反馈。

3 个答案:

答案 0 :(得分:2)

没有从sqlite发送id值,sql server有id autoincrement

答案 1 :(得分:1)

如何在服务器上使用此表。

CREATE TABLE user_activities (
  id INT AUTO_INCREMENT
, local_id INT
, user_id INT
, activity_date DATETIME
, notes TEXT
, PRIMARY KEY (id)
);

和SQLite上的这个表?

CREATE TABLE user_activities (
  local_id INT AUTO_INCREMENT
, user_id INT
, activity_date LONG
, notes TEXT
);

答案 2 :(得分:0)

在阅读下面列出的几个线程后,我决定使用UUID作为我的主键列,并从每个客户端生成一些随机UUID。

how good is java's UUID.randomUUID? Android (distributed application) primary key strategy