Итак, я работаю над приложением флаттера для малого бизнеса, где сотрудникам необходимо проверить работу (заказ), обновить свой статус, написать комментарии и т. Д. Это приложение должно работать в Интернете и в автономном режиме, поэтому я создал элементарный поток синхронизации данных
Я ищу самый простой и быстрый способ сравнить идентификаторы и метки времени между двумя списками карт
Цикл 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
}
}
}