- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的应用程序的一个用例:我有一个“房间列表” Activity ,用户可以在其中查看他加入的所有房间,单击其中一个房间后,他会进入“聊天室” Activity ,可以在其中与该房间中的其他用户聊天。房间由我的“房间”集合中的 firestore 文档表示,并且在房间中发送的消息是该文档的子集合。加入和离开房间只能通过用户的操作来完成,因此从技术上讲,我可以使用本地信息计算用户加入的房间列表,而无需查询 firebase。
但是,我希望用户能够收到他们加入的所有房间的实时更新。例如,在“房间列表” Activity 中,他们应该能够看到该房间中的参与者数量、参与者的姓名等。为此,我目前在我的每个房间文档上运行快照监听器。当用户进入“房间列表” Activity 时加入的房间列表。
问题是,除非我弄错了,否则每次用户浏览应用程序并返回房间列表或聊天室 Activity 时,这都会花费我数十次新的 firestore 读取,即使在我正在监听的数据实际上并没有改变。
注释:我正在使用一些 Activity - viewmodel - 存储库架构,我在 this post 中详细介绍了这些架构。 。我还使用一个包含 3 个 fragment 的 Activity 作为我的主要导航组件,其中包括主要 Activity 、房间列表和“我的个人资料”。我已经意识到“单一 Activity ”应用程序设计,但尚未决定完全追求它。(编辑:我使用 Android Room 作为 UI 的“单一事实来源”,并且我的存储库启动 Firestore 监听器,这些监听器从 Firebase 获取数据并将其写入 Room)
我的问题是因此:android中是否有一个独立于 Activity 的功能,可以让我一次性设置所有“后台”firestore监听器,而不会在 Activity 更改之间徒劳地重置它们,因此大大增加每月的费用?
(编辑):事实上,在我的应用程序中实现 Android Room 后不久,我就禁用了 Firestore 缓存,得出的结论是两者存在冲突。也许这是一个很大的错误。根据我对缓存的理解,以下是启用/不启用 Firestore 缓存时会发生的情况:
通过缓存,我进入“房间列表” Activity ,加载我加入的十个房间,然后浏览应用程序。几分钟后,当我返回“房间列表” Activity 时,我的 Activity 尝试再次启动监听器,并且 Firebase 识别出在此期间没有发生任何文档更新,因此导致我的文档读取次数为零(或一?)。
在没有缓存的情况下,我进入“房间列表” Activity ,加载我加入的十个房间,然后浏览应用程序。当我稍后返回“房间列表” Activity 时,我的 Activity 再次启动监听器,并且由于禁用了缓存,Firebase 只是将我再次加入的 10 个房间的列表返回给我,从而白白浪费了 10 个文档读取的时间。
最佳答案
为了避免这种情况,您可以使用Android Jetpack's ViewModel component在 Activity 配置更改之间保留对象。 。这也适用于 Firestore 查询,尽管您需要大量的管道才能正确执行此操作。对于 Stack Overflow 来说,完整的讨论太长了,但你应该观看 my talk about Firebase and Jetpack想要了解一些故事,那么check out the sample app 。您需要注意的是一个自定义 LingeringLiveData
对象,即使在检测到最后一个观察者之后,该对象也会保留一段时间,因此它不会在配置更改后立即关闭查询。
FWIW LiveData 的 Kotlin 扩展也在同样的方面“徘徊”,但 Android 没有为 Java 提供类似的解决方案。
关于java - 如何避免在 Activity 更改时杀死并重新启动 firestore 监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59484279/
我正在尝试为我的 Firestore 设置一个数据库,但是我尝试重新安装 pod 和许多其他东西,但我仍然无法让它工作,因为它显示了这个错误: Type 'Firestore' has no memb
我需要更改我的项目 ID,因为要验证的 Firebase 身份验证链接在链接上显示了项目 ID,并且由于品牌 reshape ,项目名称已更改。根据我发现的信息,更改项目 ID 似乎不太可能。我正在考
快速提问。长话短说,我在我的谷歌云功能日志中收到此错误: Firestore (4.10.1):无法到达 Firestore 后端。 这是我的函数文件中的代码: // pull in firebas
我正在从事 Angular 6 项目。这是我使用 --prod 构建时遇到的错误标记、主持和运行。我已经坐了很长时间了。最初认为这可能是 firestore 包的问题,我等了。但是现在更新到fir
我正在开发一个 React 项目,这是我的第一个 React 项目。此代码部署成功。但在使用 postman 测试时出现一些错误。我“发布”“createScream”函数的 URL 并发送它。然后我
我有一个包含两个集合的 Firestore 数据库:用户和锦标赛。用户具有“参与者”角色和“管理员”角色,并在用户文档中由“isParticipant”和“isAdmin” bool 值指示: /us
Firebase 数据库根据他们的文档提供了 10 MB 的离线数据库缓存限制,但没有提到 的离线数据限制。 Firestore 数据库。 Firestore 的离线数据保存限制是多少? 最佳答案 根
我正在尝试评估 string在 Firestore 安全规则 基于 matches正则表达式功能 我的代码是 username.matches('^(?!\.)(?!_)(?!.*\.$)(?!.*?
是否可以在 Firestore 中定义具有唯一约束的索引?如果没有,如何在文档字段上强制执行唯一性(不使用文档 ID)? 最佳答案 是的,这可以通过结合使用两个集合、Firestore 规则和批量写入
我正在学习 GCP,在他们的 Firestore 中,我对 Admin.firestore 和 Firebase.firestore 的区别感到困惑。 这是管理员的代码: const admin =
使用带有自定义声明的 firestore 在线安全模拟会导致错误,但它在部署时可以完美运行(同时实际处理真实请求)。错误是: Error: simulator.rules line [5], colu
所以,我知道有一些类似命名的问题,但这是不一样的。 我很想知道是否有人可以解释缺少 increment 的原因。哨兵,类似于delete一。 据我所知,字段删除与文档更新没有什么不同。意思是,我只能
我想创建两个带有分页选项的查询。在第一个记录中,我想获取前十条记录,在第二个记录中,我想获取其他所有记录: .startAt(0) .limit(10) .startAt(9) .limit(null
我正在努力为我的应用寻找最佳架构。我应该使用顶级集合、子集合、数组等吗? 设置: 我的应用程序将有许多用户将参与的测验。 每个测验都会有多个问题。 每个问题都有多个答案,只能选择一个。 每个用户只能回
我正在努力为我的应用寻找最佳架构。我应该使用顶级集合、子集合、数组等吗? 设置: 我的应用程序将有许多用户将参与的测验。 每个测验都会有多个问题。 每个问题都有多个答案,只能选择一个。 每个用户只能回
我无法在任何地方找到我可以在一个Collection中获得的文档数量的限制。假设我有1,000,000,000个文档...那有可能吗?如果我想把它们全部都拿走,实际上会给我十亿吗? 最佳答案 可以存储
假设我有一个集合 mycollection有 1,000,000 条记录。 此查询将返回多少条记录? const query = firestore.collection('mycollection'
这是错误消息:@firebase/firestore: Firestore (4.12.1): Could not reach Firestore backend 我正在构建一个网络应用程序,它今天运
我在编写和测试我的 Firestore 规则时遇到了一个奇怪的问题。这是我想要实现的目标: 当应用程序启动时,用户会匿名登录。这用户开始新游戏。 我创建了一个基本上只包含时间戳的“ session ”
我是云函数的新手。我有一些困惑。 admin.firestore 和functions.firestore? admin.database 是实时数据库吗? 因此,如果云函数基本上是用 JavaScr
我是一名优秀的程序员,十分优秀!