Firebase Firestore 排序集合由 ServerTimestamp 和 FirebaseUI Firest



我们知道,您可以将@ServerTimestamp注释用于集合中文档的属性,例如createdAt(在将文档插入集合时,Firebase 结构会自动分配日期(,这是一个出色的 firebase 功能。

但是,当需要从集合中获取文档列表时,只需按 createdAt 降序排序:

private Query mQuery = mFirestore.collection ("collection"). orderBy
("createdAt", Query.Direction.DESCENDING);

众所周知,将数据一次加载到回收器视图中是一种不好的做法。我发现FirebaseUI适配器已经可以使用数据分页,它很棒。

那么问题来了: Firebase Firestore 似乎在"保存"文档时无法使用此静态日期,因为在使用分页返回文档时,会抛出异常:

java.lang.IllegalArgumentException: 无效查询。你正在尝试 使用字段"createdAt"的文档开始或结束查询 是未提交的服务器时间戳。(由于此字段的值为 未知,您无法使用它开始/结束查询。

例外是非常明显和聪明的。但是,如何"冻结"文档创建时间?

我无法使用用户的本地时钟,毕竟该应用程序将在各个位置使用,这会"弄乱"查询的返回。此外,安卓用户可以简单地设置错误的时钟来操纵结果。

也许在特定集合中的每个文档中可能有一些"隐藏"的计数器属性。这将使工作变得容易得多,但无需执行此手动代码端控制。

有人遇到过这个问题吗?你能给出任何建议吗?

Cloud Firestore 有一种处理尚未提交的服务器时间戳的方法。 DocumentSnapshot 具有字段访问器方法(如 getData(((的变体,这些方法采用 ServerTimestampBehavior 枚举来指示 SDK 应采用哪些内容作为该服务器时间戳字段的值。 其中一个选项是估计值。 我猜这使得文档快照可以参与分页。

但是,FirebaseUI似乎没有使用这些枚举。 如果是这种情况,您必须:

  1. 创建您自己的适配器,而不是使用 FirebaseUI
  2. 修改 [来自 GitHub 的 FirebaseUI 源代码][3] 以执行您想要的操作
  3. 在 GitHub 上提交问题并等待它是否得到实施。

简单、面向问题的解决方案是在 Firebase 中开发一个函数来返回服务器日期并将其简单地插入集合中。

当然,在我看来,重做轮子或要求增强Firebase UI组件并不是一个明智且可行的解决方案,并且再加上未来的变化。

在我需要插入的每个集合中,只需查阅"时刻"并将结果用作属性。

简单有效,不依赖于调整运行良好的第三方组件代码。

作为对 firebase 团队的建议,请放置一些触发器示例,该示例可以在插入时将日期用作简单的静态属性。

最新更新