Извините, пожалуйста, за вопрос о новичке, или за непонятное объяснение. Для меня это довольно сложно, и я постарался сделать это как можно более понятным. Я открыт для любых идей, чтобы улучшить этот вопрос.
Я работаю над приложением Flutter, с Cloud Firestore для облачной базы данных и Sembast DB для локальной базы данных.
Сценарий такой:
Предположительно 14 июня Я добавил 5 документов в такую коллекцию:
Bob,
Sally,
Hannah,
Jane,
Chris,
Затем в облаке есть документ, который отслеживает последнее обновление, которое было 14 июня.
Теперь приложение получает данные с разбивкой на страницы по 3 документа каждый раз.
Таким образом, при первой выборке приложение получает документы: Боб, Салли, Ханна, последнее обновление было 14 июня. * 1012. * Затем приложение сохранило эти 3 документа и дату последнего обновления в своей локальной базе данных.
Предположим, после этого приложение какое-то время было отключено.
Пока он был в автономном режиме, 16 июня было добавлено 5 новых данных:
Bobby,
Andy,
John,
Jack,
Danny,
Как только приложение снова подключится к сети, оно сравнит последние данные в облаке и локальной БД и обнаружит, что последние дата обновления изменена на 16 июня. Таким образом, он получит 3 новых документа от 16 июня: Бобби, Энди и Джон.
Итак, теперь локальная база данных выглядит так:
Bobby,
Andy,
John,
Bob,
Sally,
Hannah
Вы можете видеть, что есть некоторые потерянные данные между ними: Jack
и Danny
.
Потому что они в середине списка.
Однако для Jane
и Chris
приложение получит его, когда окажется в конце списка, потому что тогда оно может использовать команду .startAfter
в Firestore.
Итак, проблема связана с данными в середине списка, такими как Jack
и Danny
. Следовательно, как приложение узнает, что там отсутствуют какие-то данные?
Мы надеемся увидеть, что когда приложение прокручивается вниз, мы надеемся, что приложение сможет заполнить недостающие данные и придать им такой вид:
Bobby,
Andy,
John,
Jack,
Danny,
Bob,
Sally,
Hannah
Этот пример состоит только из 10 документов, но в моем реальном случае я имею дело с тысячами документов с десятками и тысячами пользователей. Проверка документов по каждому «пробелу» не способствует производительности.
Более того, я должен убедиться, что я прочитал наименьшее количество документов.
И для тех, кто хочет увидеть коды. Вот код, который я использую для получения документов в Cloud Firestore:
Query query = collectionReference
.orderBy('lastUpdated', descending: true)
.startAfter([lastDocDateRetrieved])
.limit(100);
// Getting the document based on the query.
querySnapshot = await query.getDocuments();
Объяснение: этот запрос будет извлекать данные в порядке последней даты обновления в Cloud Firestore, которая начинается после даты обновления последнего документа, записанной в local DB.
Затем я сохраняю данные в локальной DB (Sembast DB):
// after converting the querySnapshot into two lists of keys and values:
await db.transaction((txn) async {
// Save all documents in the local database
await _store.records(keyList).put(txn, valueList);
});
Ключевая проблема не в коде, а в логах c того, как это сделать мы знаем, что между документами отсутствуют данные?