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

Android 如何正确实现移动客户端数据库和服务器mysql数据库之间的数据同步,android,mysql,sqlite,spring-boot,data-synchronization,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 ,

我开发了一个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)
);
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 (
  id INT AUTO_INCREMENT
, user_id INT
, activity_date LONG
, notes TEXT
);
当用户离线创建活动记录时,它将生成一个主键。当用户联机时,我必须通过httpPost同步数据。但是,我无法使用生成的id,因为它可能会导致重复问题

我可以在这方面使用什么样的方法

谢谢你的帮助

更新1

嗯。根据豪尔赫·莫雷诺和努内伊的评论,我想出了这个设计

更新2

在看过设计之后,我可能错过了客户端的一个专栏。还添加了设备id列

我认为本地id可以在用户设备之间相似,因此添加设备id将使使用设备id和本地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
);

感谢您的反馈。

不要从sqlite发送id值,sql server有id自动增量

不要从sqlite发送id值,sql server有id自动增量

不要从sqlite发送id值,sql server有id自动增量

不要从sqlite发送id值,sql server的id是自动递增的

服务器上的这个表怎么样

CREATE TABLE user_activities (
  id INT AUTO_INCREMENT
, user_id INT
, activity_date DATETIME
, notes TEXT
, PRIMARY KEY (id)
);
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
);

服务器上的这张桌子怎么样

CREATE TABLE user_activities (
  id INT AUTO_INCREMENT
, user_id INT
, activity_date DATETIME
, notes TEXT
, PRIMARY KEY (id)
);
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
);

服务器上的这张桌子怎么样

CREATE TABLE user_activities (
  id INT AUTO_INCREMENT
, user_id INT
, activity_date DATETIME
, notes TEXT
, PRIMARY KEY (id)
);
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
);

服务器上的这张桌子怎么样

CREATE TABLE user_activities (
  id INT AUTO_INCREMENT
, user_id INT
, activity_date DATETIME
, notes TEXT
, PRIMARY KEY (id)
);
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
);

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


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


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


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