首页 > 解决方案 > Android Firebase 查询范围(上、中、下)

问题描述

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

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

我只能给limitToFirst,,,,limitToLast。(我认为没有中心)startAtendAt

我需要提供时间戳(例如上午 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:无法在查询中调用 limitToLast 先前设置的限制!

我该怎么办?

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

在此处输入图像描述

标签: androidfirebasefirebase-realtime-database

解决方案


startAt您可以通过组合和来选择一个范围endAt,这两者都对您订购的孩子进行操作。例如,如果您想在某个日期的上午 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);

推荐阅读