我在服务器上有一个(概念性的)sqlite数据库,该数据库与我将要开发的Android应用程序的sqlite数据库保持一致。
我正在为名为_id的某个变体的每个表使用自动增量整数主键,例如_entry_id或_goal_id。
我正在通过为每个表创建一个'修改'表来处理同步,该表详细说明了哪个表发生了哪些操作以及该表中的哪些条目。
用户有CHOICE与服务器同步,但没有必要。这一点至关重要,遗憾的是,无论何时使用应用程序,人们都无法与服务器同步。
我在概念层面遇到以下问题:
假设服务器数据库有一个表'entry',其中包含以下字段:
数据库目前没有条目。
假设有两台设备正在运行该应用。应用程序和服务器使用相同的数据库架构。
假设device1有条目:
如果device1决定同步,通过一些不重要的向导,系统将决定这两个条目是新的并将它们添加到服务器数据库,因此服务器数据库现在有条目:
现在说设备2决定不与服务器数据库进行同步,然后为其数据库创建一些新条目,现在有条目:
如果它现在决定同步,那么系统将决定这些是新条目并将它们添加到数据库,以便数据库现在具有条目:
现在设备2有条目:
现在,对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时),您应该在服务器数据库中留下以下内容:
以下是device3的数据库:
表示所有主键都是一致的。
这个算法在sqlite中是否可行?
如果没有,或者这个算法不是最好的,那么处理这个问题的另一种方法是什么?
我希望我在解释中已经足够清楚了。
干杯。
答案 0 :(得分:0)
不确定你是否需要这个答案,但想到帮助社区,就在这里:
我正在使用我的应用程序遇到类似的问题。我决定使用复合 PK,如@ user1843640提出的this问题所述。
虽然问题似乎没有正确的答案,但问题本身帮助我思考了解决问题的方法。在两周内完成,我将完成我的实施,因为这是我正在开发的学术工作,我将在GitHub中公开提供该来源。完成之后我会回到这里:)