【问题标题】:Android Firebase query with range (Above, Mid, Bottom)Android Firebase 查询范围(上、中、下)
【发布时间】:2018-06-11 11:35:24
【问题描述】:

我刚开始在 Android 中使用 Firebase,我写了这样的查询。

messageSearchQuery = FirebaseDatabase.getInstance().getReference().child("Message")
    .child(conversationID).limitToLast(INITIAL_MESSAGE_COUNT)
    .orderByChild("timestamp").startAt(participant.joiningDate).endAt(endAt);

我只能给limitToFirstlimitToLaststartAtendAt。 (我认为没有中心)

我需要提供时间戳(例如上午 10 点),我想在上午 10 点之前查询 10 条消息,在上午 10 点之后查询 10 条消息。 (但我不知道它什么时候开始,什么时候结束)。

编辑

我想做的是这样的。

messageSearchQuery = FirebaseDatabase.getInstance().getReference().child("Message").
                    child(conversationID).
                    orderByChild("timestamp").equalTo(endAt).limitToFirst(INITIAL_MESSAGE_COUNT).limitToLast(INITIAL_MESSAGE_COUNT);

但如果我这样做,它会像这样崩溃。

java.lang.IllegalArgumentException: Can't call limitToLast on query with previous set limit!

我该怎么办?

我在 firebase 中的数据是这样的。

【问题讨论】:

  • 我的快速回答如下。如果这对您不起作用,请多展示您正在尝试做的事情。例如。看到你的 JSON 真的很有帮助(作为文本,请不要截图)。您可以通过单击Firebase Database console 中的“导出 JSON”链接来获取此信息。如果您将所有我们看不到的变量替换为重现问题的硬编码值,也会有所帮助。
  • @FrankvanPuffelen 我已经放了我的样本数据。

标签: android firebase firebase-realtime-database


【解决方案1】:

您可以通过组合startAtendAt 来选择一个范围,这两者都对您订购的孩子进行操作。例如,如果您想在某个日期的上午 10 点到晚上 10 点之间发送消息,您可以:

long timestampOf10am = ...;
long timestampOf10pm = ...;
messageSearchQuery = FirebaseDatabase.getInstance().getReference().child("Message")
  .child(conversationID)
  .orderByChild("timestamp").startAt(timestampOf10am).endAt(timestampOf10pm)
  .limitToLast(INITIAL_MESSAGE_COUNT);

更新:如果您在上午 10 点之前需要 10 个项目,而在上午 10 点之后需要 10 个项目,则需要触发两个查询并在客户端合并结果。

long timestampOf10am = ...;
beforeMessageSearchQuery = FirebaseDatabase.getInstance().getReference().child("Message")
  .child(conversationID)
  .orderByChild("timestamp").startAt(timestampOf10am)
  .limitToFirst(INITIAL_MESSAGE_COUNT);
afterMessageSearchQuery = FirebaseDatabase.getInstance().getReference().child("Message")
  .child(conversationID)
  .orderByChild("timestamp").endAt(timestampOf10am)
  .limitToLast(INITIAL_MESSAGE_COUNT);

【讨论】:

  • 谢谢。问题是我不知道 startAt、endAt 的时间戳。我只知道我的 1 个时间戳(上午 10 点),我需要在上午 10 点之前查询 10 条消息,在上午 10 点之后查询 10 条消息。我该怎么办?
  • 啊,这需要两个查询:一个是startAt().limitToFirst(),一个是endAt().limitToLast()。我更新了我的答案。
  • 是否可以结合这两个查询?如果没有,我会尝试两个查询。
  • 不,没有办法将它们结合起来。您需要两个查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多