Это вопрос алгоритма, касающийся синхронизации данных между мобильным приложением и его сервером.
Я сравниваю два списка карт [{id: int, last_update: timestamp}], которые представляют список объектов, расположенных в базе данных сервера (список серверов) и мобильной базе данных (список мобильных устройств). Цель этого сравнения - синхронизировать мой сервер и мобильные базы данных.
По сути, есть четыре случая, которые мне нужно различать при сравнении двух списков для синхронизации.
ЧАСТЬ A) карта для определенного идентификатора присутствует только в одном из списков карт
1) ПОЛУЧИТЬ ИЗ СЕРВЕРА В МОБИЛЬНЫЙ: если в списке серверов есть элемент, содержащий идентификатор, которого нет в списке мобильных устройств, это означает, что мне нужно получить объект для этого идентификатора с сервера и вставить его в мой мобильный дб
2) УДАЛИТЬ ИЗ МОБИЛЬНОЙ БД: если в списке мобильных устройств есть элемент, содержащий идентификатор, которого нет в списке серверов, это означает, что сервер удалил этот элемент (может удалить только элемент с сервера). Мне нужно удалить строку, содержащую этот идентификатор на мобильных БД.
ЧАСТЬ B) карта для конкретного идентификатора присутствует в обоих списках
3.1) POST FROM MOBILE TO SERVER: если отметка времени для определенного идентификатора новее в списке мобильных устройств, я опубликую этот элемент на сервере
3.2) ПОЛУЧИТЬ ИЗ СЕРВЕРА В МОБИЛЬНЫЙ: если отметка времени для определенного идентификатора новее в списке серверов, я получу этот объект с сервера
При сравнении двух списков я создаю два новых списка.
Один список всех идентификаторов, которые я хочу запросить у сервера (1 и 3.2 выше)
Другой список - это список всех объектов, которые я хочу отправить на сервер (3.1 выше)
Проходя через это сравнение, я хочу соответствующим образом добавить элементы в эти списки, и я выполню правильные сетевые вызовы после того, как будет выполнено полное сравнение.
Прямо сейчас мой код может сравнивать только два одинаковых идентификатора из обоих списков и сообщать, какой из них обновлен более недавно, но не может определить, содержит ли один список идентификатор, которого нет у другого.
Код здесь в 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
}
}
}