通过 ServerTimestamp 和 FirebaseUI Firestore Pagination 对 Firebase Firestore 进行排序收集
Firebase Firestore sort collection by ServerTimestamp and with FirebaseUI Firestore Pagination
我们知道可以对集合中文档的属性使用@ServerTimestamp注解,例如createdAt(文档插入集合时,firebase结构自动分配日期)和这个是一个出色的 Firebase 功能。 .
但是,当需要从集合中获取文档列表时,只需按 createdAt 降序排序:
private Query mQuery = mFirestore.collection ("collection"). orderBy
("createdAt", Query.Direction.DESCENDING);
众所周知,一次将数据加载到回收站视图中是一种不好的做法。我发现 FirebaseUI 适配器已经可以使用数据分页了,太棒了。
那么问题来了:
似乎 Firebase Firestore 在 "saving" 文档时不适用于此静态日期,因为当 return 使用分页编辑文档时,会抛出异常:
java.lang.IllegalArgumentException: Invalid query. You are trying to
start or end a query using a document for which the field 'createdAt'
is an uncommitted server timestamp. (Since the value of this field is
unknown, you cannot start / end a query with it.)
这个异常很清楚很聪明。但是,如何"freeze"文件的创建时间呢?
我无法使用用户的本地时钟,毕竟该应用程序将在各个位置使用,并且此 "messes" 查询 return。此外,android 用户可以简单地设置错误的时钟来操纵结果。
也许在特定集合的每个文档中可能有一些 "hidden" 计数器属性。这将使工作变得容易得多,但无需执行此手动代码端控制。
有人遇到过这个问题吗?你能给点建议吗?
Cloud Firestore 有一种处理未提交的服务器时间戳的方法。 DocumentSnapshot 具有字段访问器方法的变体(例如 getData()) that take a ServerTimestampBehavior 枚举,以指示 SDK 应将什么作为该服务器时间戳字段的值。选项之一是估计值。我猜这使得它成为可能参与分页的 DocumentSnapshot。
但是,FirebaseUI 似乎没有使用这些枚举。如果是这种情况,您必须:
- 创建您自己的适配器而不是使用 FirebaseUI
- 修改 [来自 GitHub][3] 的 [FirebaseUI 源代码] 以执行您想要的操作
- 在 GitHub 上提交问题并等待它是否得到实施。
简单的、以问题为导向的解决方案是在 Firebase 中开发一个函数以 return 服务器日期并将其简单地插入到集合中。
当然,重做轮子,或者要求增强 Firebase UI 组件,在我看来,这并不是一个明智且可行的解决方案,而且还要考虑到未来的变化。
在我需要插入的每个集合中,只需参考 "moment" 并将结果用作属性。
简单有效,不依赖于调整运行良好的第三方组件代码。
作为对 firebase 团队的建议,放一些可以在插入时将日期用作简单静态属性的触发器示例。
我们知道可以对集合中文档的属性使用@ServerTimestamp注解,例如createdAt(文档插入集合时,firebase结构自动分配日期)和这个是一个出色的 Firebase 功能。 .
但是,当需要从集合中获取文档列表时,只需按 createdAt 降序排序:
private Query mQuery = mFirestore.collection ("collection"). orderBy
("createdAt", Query.Direction.DESCENDING);
众所周知,一次将数据加载到回收站视图中是一种不好的做法。我发现 FirebaseUI 适配器已经可以使用数据分页了,太棒了。
那么问题来了: 似乎 Firebase Firestore 在 "saving" 文档时不适用于此静态日期,因为当 return 使用分页编辑文档时,会抛出异常:
java.lang.IllegalArgumentException: Invalid query. You are trying to start or end a query using a document for which the field 'createdAt' is an uncommitted server timestamp. (Since the value of this field is unknown, you cannot start / end a query with it.)
这个异常很清楚很聪明。但是,如何"freeze"文件的创建时间呢?
我无法使用用户的本地时钟,毕竟该应用程序将在各个位置使用,并且此 "messes" 查询 return。此外,android 用户可以简单地设置错误的时钟来操纵结果。
也许在特定集合的每个文档中可能有一些 "hidden" 计数器属性。这将使工作变得容易得多,但无需执行此手动代码端控制。
有人遇到过这个问题吗?你能给点建议吗?
Cloud Firestore 有一种处理未提交的服务器时间戳的方法。 DocumentSnapshot 具有字段访问器方法的变体(例如 getData()) that take a ServerTimestampBehavior 枚举,以指示 SDK 应将什么作为该服务器时间戳字段的值。选项之一是估计值。我猜这使得它成为可能参与分页的 DocumentSnapshot。
但是,FirebaseUI 似乎没有使用这些枚举。如果是这种情况,您必须:
- 创建您自己的适配器而不是使用 FirebaseUI
- 修改 [来自 GitHub][3] 的 [FirebaseUI 源代码] 以执行您想要的操作
- 在 GitHub 上提交问题并等待它是否得到实施。
简单的、以问题为导向的解决方案是在 Firebase 中开发一个函数以 return 服务器日期并将其简单地插入到集合中。
当然,重做轮子,或者要求增强 Firebase UI 组件,在我看来,这并不是一个明智且可行的解决方案,而且还要考虑到未来的变化。
在我需要插入的每个集合中,只需参考 "moment" 并将结果用作属性。
简单有效,不依赖于调整运行良好的第三方组件代码。
作为对 firebase 团队的建议,放一些可以在插入时将日期用作简单静态属性的触发器示例。