Сравнение двух списков карт с Dart - онлайн / офлайн синхронизация данных - PullRequest
0 голосов
/ 07 июня 2019

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

Я ищу самый простой и быстрый способ сравнить идентификаторы и метки времени между двумя списками карт

Цикл for в функции compareServerAndLocalData в настоящее время может сравнивать метки времени между соответствующими идентификаторами сервера и локальными идентификаторами базы данных (2b ниже), но не может проверить, существует ли идентификатор, который не существует в локальная или серверная база данных, существующая в другой (2а и 2с ниже)

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

1) отправить запрос на получение на сервер, сервер отправит обратно список карт, содержащих метку времени 'order_id' и 'last_update'.

2) сравнить идентификаторы заказа и последние обновления с сервера с идентификаторами заказа и отметками времени последнего обновления из базы данных sqlite на телефоне

3) в конце сравнения сервера и локального списка карт БД я буду либо запрашивать Заказы с сервера, либо отправлять заказы на обновление сервера.

class FullSyncAPI {
  final storage = new FlutterSecureStorage();
  DatabaseHelper _databaseHelper = DatabaseHelper();

  fetchIDsAndTimestamps() async {
    String token = await storage.read(key: "access_token");

    final http.Response response = await http.get(
      "http://dev.orders.bmvreo.com/api/user/all/updatedat",
      headers: {"Authorization": "Bearer $token", "accept": "application/json"},
    );

    if (response.statusCode == 200) {
      List orderServiceMap = json.decode(response.body);
      compareServerAndLocalData(orderServiceMap);
    } else {
      throw Exception('Failed grab order service ids and timestamps');
    }
  }

  compareServerAndLocalData(List fromServer) async {
    List<Map<String, dynamic>> fromDb = await FetchOrderIdAndTimeDbApi().getIdTimeMap();

    Map<String, dynamic> orderRequestIds = Map<String, dynamic>();
    List<OrderService> ordersToSend = List<OrderService>();


    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)) {
            print(
                'this means that the database is newer than the server... update server');
            // TODO
            // query db for order with id == fromDb[j]['id']
            // add order to ordersToSend list
          } else if (dbTime.isBefore(serverTime)) {
            print(
                'this means that the server is newver than the db... update database');
            // TODO add fromDb[j]['id'] to orderRequestIds list
          }
        } else {

        }

      }

    }

    // determine which order objects to send
    for (int i = 0; i < ordersToSend.length; i++) {
      await UpdateOrderServiceApi().updateOrder(ordersToSend[i]);
    }
    // get the ids
    for (int i = 0; i < orderRequestIds.length; i++) {
      var order = await FetchOrderServiceAPI().fetchOrder(orderRequestIds[i]);
      // TODO save OR update order in database
    }
  }
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...