сравнение двух списков карт [{id: int, last_update: timestamp}] для поиска последних обновлений и т. д. - PullRequest
0 голосов
/ 11 июня 2019

Это вопрос алгоритма, касающийся синхронизации данных между мобильным приложением и его сервером.

Я сравниваю два списка карт [{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
        }
      }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...