Как мне заполнить «пробелы» в недостающих данных в Firestore или убедиться, что они заполнены? - PullRequest
0 голосов
/ 19 июня 2020

Извините, пожалуйста, за вопрос о новичке, или за непонятное объяснение. Для меня это довольно сложно, и я постарался сделать это как можно более понятным. Я открыт для любых идей, чтобы улучшить этот вопрос.

Я работаю над приложением 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 того, как это сделать мы знаем, что между документами отсутствуют данные?

1 Ответ

1 голос
/ 20 июня 2020

При использовании разбивки на страницы для циклического просмотра документов из запроса (с использованием startAfter()) API может не сообщать вам, были ли добавлены новые документы на страницу, которую вы уже прошел. Если вы хотите знать, были ли добавлены новые документы, вам придется начать запрос с самого начала. каждый запрос страницы и держите их все активными, чтобы слушатель мог сказать вам, если что-то изменилось на этой странице. Чтобы сделать это правильно, потребуется довольно много кода для обработки всех граничных случаев, и это может оказаться дорогостоящим, если ваши документы часто меняются.

...