带有范围的Android Firebase查询(上方,中间,下方)

时间:2018-06-11 02:51:47

标签: android firebase firebase-realtime-database

我刚开始在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:无法在先前设置的限制的情况下调用limitToLast!

我该怎么办?

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

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以通过合并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);