Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 同步数据库sqlite时的一致自动增量主键_Android_Database_Sqlite_Auto Increment_Consistency - Fatal编程技术网

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

Android 同步数据库sqlite时的一致自动增量主键,android,database,sqlite,auto-increment,consistency,Android,Database,Sqlite,Auto Increment,Consistency,我在服务器上有一个(概念上的)sqlite数据库,它与我将要开发的Android应用程序的sqlite数据库保持一致 我对每个名为_id变量的表使用自动递增整数主键,例如_entry _id或_goal _id 我通过为每个表创建一个“修改”表来处理同步,该表详细说明对哪个表发生了哪些操作以及该表中的哪些条目 用户可以选择与服务器同步,但这不是必需的。这一点至关重要,遗憾的是,在人们使用应用程序时,强迫他们与服务器同步的选项是不可能的 我在概念层面上遇到了以下问题: 假设服务器数据库有一个包含以

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

我对每个名为_id变量的表使用自动递增整数主键,例如_entry _id或_goal _id

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

用户可以选择与服务器同步,但这不是必需的。这一点至关重要,遗憾的是,在人们使用应用程序时,强迫他们与服务器同步的选项是不可能的

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

假设服务器数据库有一个包含以下字段的表“条目”:

  • “\u entry\u id”是一个自动递增的整数主
  • “title”是一个文本字段
数据库当前没有条目

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

假设device1具有以下条目:

  • 0,deventry0
  • 1,开发项目1
如果device1决定同步,则通过一些不重要的向导,系统将确定这两个条目是新的,并将它们添加到服务器数据库中,因此服务器数据库现在具有以下条目:

  • 0,deventry0
  • 1,开发项目1
现在假设device2决定不与服务器数据库同步,然后在其数据库中创建一些新条目,现在有了这些条目:

  • 0,dev2entry0
  • 1,Dev2 Entry1
如果现在决定同步,则系统将确定这些是新条目,并将它们添加到数据库中,以便数据库现在具有以下条目:

  • 0,deventry0
  • 1,开发项目1
  • 2,Dev2入口0
  • 3,Dev2 entry1
而device2现在有以下条目:

  • 0,dev2entry0
  • 1,Dev2 Entry1
  • 2,dev1入口0
  • 3月1日
现在,对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,Dev2 Entry1
  • 2,dev1入口0
  • 3月1日
  • 4,dev3entry0
以及device3数据库中的以下内容:

  • 4,dev3entry0
这意味着所有主键都是一致的

这种算法在sqlite中可行吗

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

我希望我的解释已经够清楚了


干杯。

不确定您是否还需要这个答案,但考虑到帮助社区的想法,下面是:

我的应用程序也遇到了类似的问题。我决定使用一个复合PK,正如@user1843640的问题所描述的那样


虽然这个问题似乎没有正确的答案,但这个问题本身帮助我思考解决这个问题的方法。最多两周后,我将完成我的实现,由于这是我正在开发的一项学术工作,我将在GitHub中公开该源代码。完成后我会回到这里:)

我面临着类似的问题。你找到解决办法了吗?还没有。我已经推迟了在我的软件中同步的工作,直到它完全需要实现。我很有兴趣看到你实现这一点,干杯!