Почему мы вынуждены использовать keepSynced с базой данных firebase?

Я использую React Native с базой данных Firebase Realtime. Тестирую простое приложение для чата, и я получаю чаты следующим образом:

 this.friendChatRef = this.db.ref('messages/' + this.chat_id + '/' + this.friend_id)

 const friendChatRef = this.friendChatRef.limitToLast(9)

 const fcrp = friendChatRef.once('value')

Цель состоит в том, чтобы всегда получать последние 9 сообщений из беседы при монтировании компонента/представления.

Проблема в том, что он получит 9 чатов, но они никоим образом не являются последними. Я могу добавить более 10 новых сообщений, но они никогда не будут получены, пока я не добавлю это:

 friendChatRef.keepSynced(true)

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

Почему мы должны использовать keepSynced? Я думал, что постоянство предназначено только для кэширования данных в автономном режиме, но оно всегда проверяет, устарели ли кэшированные данные или нет, каждый раз, когда вы создаете ссылку и извлекаете данные?

Есть ли способ сохранить постоянство и не использовать keepSynched для получения последних данных?


person AlwaysConfused    schedule 17.06.2019    source источник
comment
Проблема в том, что он получит 9 чатов, но они никоим образом не являются последними. Код, которым вы поделились, еще не считывает данные. Если у вас возникла проблема, всегда показывайте минимальный код, воспроизводящий проблему.   -  person Frank van Puffelen    schedule 17.06.2019
comment
@FrankvanPuffelen Я добавил дополнительный код, но это ссылка на базу данных, чтобы получить последние 9 сообщений от этой ссылки. Суть в том, что без keepSynced они просто не будут извлекаться, как должны, а с true работают как положено.   -  person AlwaysConfused    schedule 18.06.2019
comment
Вы используете once(), который плохо работает вместе с сохраняемостью диска. См. мои подробные ответы здесь разница между setpersistenceenabled и keepsynced">stackoverflow.com/questions/40190234/ и stackoverflow.com/questions/34486417/. По сути: вам нужно либо использовать on(), либо keepSynced (что по существу сохраняет пустой прослушиватель on() в местоположении), чтобы это работало.   -  person Frank van Puffelen    schedule 18.06.2019
comment
Жаль, что я не могу получить из кеша, а затем один раз проверить ссылку на базу данных на наличие новых данных и вместо этого использовать keepSynced, так как для меня всегда иметь прослушиватель - не лучший вариант.   -  person AlwaysConfused    schedule 18.06.2019
comment
Вызов keepSynced(true) добавляет к местоположению пустой прослушиватель.   -  person Frank van Puffelen    schedule 18.06.2019