在同步到服务器之前要在本地 android 数据库上设置什么主键?

What primary key to set on local android db before syncing it to server?

我正在制作一个具有数据库模型的应用程序:

Item (int id, String name, String description, Date updatedDate, boolean isSynced)

Itemid 是它的主键(在本地和服务器上)并且 id 在服务器上自动生成 mysql db。我正在使用领域在 android 设备上存储 Items

用户可以在设备 with/without 互联网上创建和编辑 Items。当互联网连接可用时同步数据库。

因此,当用户保存一个新的 Item 时,那么 id 我应该将其保存在本地数据库中,以便与服务器同步不会造成问题

示例:

John 在他的 Moto XSamsung S6 上有 3 Items 并且两部手机都同步到服务器。

他将 Moto X 置于飞行模式,并在 Samsung S6 上添加一个 Item 并同步到服务器。

现在,S6 有 ID 为 -> 1,2,3,4

的项目

Moto X 的项目 ID -> 1,2,3

当 Moto X 连接到互联网时,它会下载 Item id=4 但它仍然处于飞行模式。

虽然 Moto X 仍处于离线状态,但约翰在其上添加了 Item。我应该为本地数据库上的这个新 Item 提供什么 ID,以便在同步 Moto X 时不会造成任何问题? John 应该可以在离线 Moto X 上编辑这个新的 Item,所以 id 不能留空。

谢谢

只是吐口水...

向项目 class 添加 int local_idint device_id。每个与服务器交互的设备都将获得一个唯一且持久的 device_id。在没有互联网连接的设备上创建项目时,如果需要编辑项目,设备可以参考 local_id。当设备连接上一个Item(!isSynced && id == null)时,将Item发送到DB中进行插入操作,然后通过搜索local_id找到新插入的DB行的主键和device_id。主键值被发送回设备,Item 在服务器上的主键设置为 Item 本地副本上的 id 并将 isSynced 设置为 true.

ETA:从数据库服务器检索在其他设备上创建的项目时,将这些项目放入设备的 table.

时,您需要省略外部 local_id

ETA2:您需要更改设备上的 table 设置,以便 local_id 成为主键,而 id 成为唯一键。但是当然 id 仍然是数据库服务器上 table 上的主键。