Android Firebase 查询问题

Android Firebase Query Issue

数据样本:

 {
  "families" : {
    "4039738864" : {
      "2019-11-09" : {
        "-LtGOEjR-u_RKbXCiO2d" : {
          "messageDate" : "2019-11-09",
          "messageText" : "Test 1",
          "messageTime" : "11:20",
          "messageUser" : "dadio"
        },
        "-LtI2urxYkILHrYZdtmv" : {
          "messageDate" : "2019-11-09",
          "messageText" : "Hey man how is it going?",
          "messageTime" : "19:06",
          "messageUser" : "dadio"
        },

基本上是创建当天的消息对象列表。我想要的是撤回 10 天的消息(最近 10 天)。

我试过这个查询:

Query query = familyRef.child(familyKey).orderByKey().startAt(startDate).endAt(endDate).limitToLast(10);


adapter = new FirebaseRecyclerAdapter<ChatMessage, ChatHolder>(options) {

            @NonNull
            @Override
            public ChatHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                final View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.recycler_item, parent, false);

                return new ChatHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull ChatHolder chatHolder, int i, @NonNull ChatMessage chatMessage) {

                //TODO: .toLocalDateTime() all dates

但这确实会拉回子对象只是实际的日期节点。

有什么想法吗?

您可以获得单个日期的数据,例如 Query query = familyRef.child(familyKey).orderByKey().whereEqualTo("startDate", startDate).limitToLast(10);

你所描述的听起来像是我预期的行为。 FirebaseUI 适配器处理与您传入的查询相匹配的子节点。

由于您将 /families/$familyid 上的查询传递给适配器,因此会为每个匹配的子项(即日期)实例化一个视图持有者。

如果您想显示两个日期之间的消息列表,您当前的数据结构不适合此操作。相反,请考虑像这样存储您的数据:

  "families" : {
    "4039738864" : {
      "-LtGOEjR-u_RKbXCiO2d" : {
        "messageDate" : "2019-11-09",
        "messageText" : "Test 1",
        "messageTime" : "11:20",
        "messageUser" : "dadio"
      },
      "-LtI2urxYkILHrYZdtmv" : {
        "messageDate" : "2019-11-09",
        "messageText" : "Hey man how is it going?",
        "messageTime" : "19:06",
        "messageUser" : "dadio"
      },
      "-LtI2urxYkILHrYZdtmx" : {
        "messageDate" : "2019-11-10",
        "messageText" : "Totes good!",
        "messageTime" : "09:11",
        "messageUser" : "puf"
      },

在上面的重组数据中,我从您的 JSON 中删除了 "date" 级别。由于您在每条消息中已经有了日期,因此不会丢失任何数据,您现在可以使用 FirebaseUI 实现您的用例。

使用此数据结构,您可以查询与以前相同的日期范围:

Query query = familyRef.child(familyKey).orderByChild("MessageDate").startAt(startDate).endAt(endDate).limitToLast(10);

如果您不想重组数据,则必须创建自定义适配器来处理用例。您需要将自己的侦听器附加到数据结构,解析来自 DataSnapshot 的每一天的消息,并更新适配器中的数据。