同步数据库sqlite时一致的自动增量主键

时间:2014-01-28 17:33:25

标签: android database sqlite auto-increment consistency

我在服务器上有一个(概念性的)sqlite数据库,该数据库与我将要开发的Android应用程序的sqlite数据库保持一致。

我正在为名为_id的某个变体的每个表使用自动增量整数主键,例如_entry_id或_goal_id。

我正在通过为每个表创建一个'修改'表来处理同步,该表详细说明了哪个表发生了哪些操作以及该表中的哪些条目。

用户有CHOICE与服务器同步,但没有必要。这一点至关重要,遗憾的是,无论何时使用应用程序,人们都无法与服务器同步。

我在概念层面遇到以下问题:

假设服务器数据库有一个表'entry',其中包含以下字段:

  • '_ entry_id',这是一个自动增量整数主
  • 'title'是一个文本字段。

数据库目前没有条目。

假设有两台设备正在运行该应用。应用程序和服务器使用相同的数据库架构。

假设device1有条目:

  • 0,dev1entry0
  • 1,dev1entry1

如果device1决定同步,通过一些不重要的向导,系统将决定这两个条目是新的并将它们添加到服务器数据库,因此服务器数据库现在有条目:

  • 0,dev1entry0
  • 1,dev1entry1

现在说设备2决定不与服务器数据库进行同步,然后为其数据库创建一些新条目,现在有条目:

  • 0,dev2entry0
  • 1,dev2entry1

如果它现在决定同步,那么系统将决定这些是新条目并将它们添加到数据库,以便数据库现在具有条目:

  • 0,dev1entry0
  • 1,dev1entry1
  • 2,dev2entry0
  • 3,dev2entry1

现在设备2有条目:

  • 0,dev2entry0
  • 1,dev2entry1
  • 2,dev1entry0
  • 3,dev1entry1

现在,对device2上的条目所做的任何修改都将修改服务器上的错误条目,因为主键不正确。

我想到了解决这个问题的方法。因为这是(据我所知)在向表中插入新条目时只会出现问题。我的想法如下:

Assume the same entries for the server database as above
Assume that a new device, device3, has an entry:
    - 0, dev3entry0

when an insert needs to occur when syncinc
  get the id that's been assigned to device3's entry: 0
  check the id against the largest id that's already been assigned to the server's db: 3
  if 0 == 3 + 1 (the next increment to be assigned)
    then insert the new entry to the database, the keys are the same
  otherwise
    duplicate the entry in device3 so that the key == 3 + 1
    delete the original entry

使用此算法(当您不考虑同步到device3时),您应该在服务器数据库中留下以下内容:

  • 0,dev2entry0
  • 1,dev2entry1
  • 2,dev1entry0
  • 3,dev1entry1
  • 4,dev3entry0

以下是device3的数据库:

  • 4,dev3entry0

表示所有主键都是一致的。

这个算法在sqlite中是否可行?

如果没有,或者这个算法不是最好的,那么处理这个问题的另一种方法是什么?

我希望我在解释中已经足够清楚了。

干杯。

1 个答案:

答案 0 :(得分:0)

不确定你是否需要这个答案,但想到帮助社区,就在这里:

我正在使用我的应用程序遇到类似的问题。我决定使用复合 PK,如@ user1843640提出的this问题所述。

虽然问题似乎没有正确的答案,但问题本身帮助我思考了解决问题的方法。在两周内完成,我将完成我的实施,因为这是我正在开发的学术工作,我将在GitHub中公开提供该来源。完成之后我会回到这里:)