这是一个算法问题,涉及我如何在移动应用与其服务器之间同步数据。
我正在比较两个映射列表[{id:int,last_update:timestamp}],它们表示位于服务器数据库(服务器列表)和移动数据库(移动列表)上的对象列表。进行比较的目的是同步我的服务器和移动数据库。
基本上,在比较两个列表进行同步时,我需要区分4种情况。
部分A)特定ID的地图仅出现在其中一个地图列表中
1)从服务器到移动设备获取:如果服务器列表中有一个项目包含一个不在移动列表中的ID,这意味着我需要从服务器获取该ID的对象并将其插入我的手机数据库
2)从移动数据库中删除:如果移动列表中有一个项目包含服务器列表中没有的ID,则表示服务器已删除该项目(只能从服务器中删除项目)。我需要删除移动数据库上包含该ID的行。
部分B)特定ID的地图同时出现在两个列表中
3.1)从移动设备发布到服务器:如果特定ID的时间戳在“移动列表”上较新,我将将此项目发布到服务器上
3.2)从服务器迁移到移动设备:如果特定ID的时间戳在服务器列表中较新,则我将从服务器中获取该对象
在比较两个列表时,我正在创建两个新列表。
一个列表是我要从服务器请求的所有ID(上面的1和3.2)
另一个列表是我要发送到服务器的整个对象的列表(上面的3.1)
在进行此比较时,我想将项目适当地添加到这些列表中,并且在完成整个比较之后,我将进行适当的网络调用。
现在,我的代码只能比较两个列表中的两个相同的ID,并判断哪个是最近更新的,但是无法确定一个列表是否包含另一个列表不包含的ID。
这里的代码在Dart中,但是我可以使用任何语言,psuedocode对我来说也很好。任何帮助将不胜感激,因为我当前的方法比较笨拙,而且显然是不完整的。
ps,我知道我的方法不能解决两个项目都更新时发生的冲突,然后会发生同步,但是atm无关紧要。
List<Map<String, dynamic>> fromServer = List<Map> fromServer
List<Map<String, dynamic>> fromDb = List<Map> fromDb
List<int> orderRequestIds = List<int>();
List<OrderService> ordersToSend = List<OrderService>();
// compare timestamps
for (int i = 0; i < fromServer.length; i++) {
for (int j = 0; j < fromDb.length; j++) {
if (fromServer[i]['id'] == fromDb[j]['id']) {
// todo check and see which is more current
DateTime dbTime = DateTime.parse(fromDb[j]['updated_at']);
DateTime serverTime = DateTime.parse(fromServer[i]['updated_at']);
if (dbTime.isAfter(serverTime)) {
// TODO add order to ordersToSend list
} else if (dbTime.isBefore(serverTime)) {
// add fromDb[j]['id'] to orderRequestIds list
} else {
// times are the same so i do nothing
}
} else {
// i dont think I really do anything here
}
}
}