我要设置firebase实时数据库或者条件语句

I want to set the firebase real-time database or conditional statement

我正在制作一个聊天应用程序。 A 向 B 发送消息,在 A 的设备上查看聊天室时可以清楚地看到该消息。但是当我去B的设备上查看聊天window时,我看不到A发送的消息。我知道问题出在哪里,但我不知道如何解决。我需要帮助。

我的数据库结构如下:

"chatrooms" : {
    "-Mn0ZDpdWsOb8XFFTYmi" : {
      "comments" : {
        "-Mn0ZG0UoMY81i9sf6nN" : {
          "message" : "hi",
          "timestamp" : 1635335082263,
          "uid" : "QTC8Msw1n2aUF8mDbTCUNk5k7sH3"
        }
      },
      "users" : {
        "itemName" : "goods",
        "sellerUid" : "vzTQG0Fb3DgsVKGgGj0R23uL6Hx2",
        "uid" : "QTC8Msw1n2aUF8mDbTCUNk5k7sH3"
      }
    }

这是一个有问题的代码:

FirebaseDatabase.getInstance().getReference().child("chatrooms")
        .orderByChild("users/uid").equalTo(uid).addListenerForSingleValueEvent(new ValueEventListener(){
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        chatModels.clear();
        for (DataSnapshot item : snapshot.getChildren()){
            chatModels.add(item.getValue(ChatModel1.class));
        }
        notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {

    }
});

============

FirebaseDatabase.getInstance().getReference().child("chatrooms")
        .orderByChild("users/sellerUid").equalTo(uid).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        chatModels.clear();
        for (DataSnapshot item : snapshot.getChildren()){
            chatModels.add(item.getValue(ChatModel1.class));
        }
        notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {

    }
});

A的消息显示在B的设备上,离解决问题还很远

所以,我想要的是: FirebaseDatabase.getInstance().getReference().child("chatrooms") .orderByChild("users/uid").equalTo(uid).addListenerForSingleValueEvent

在这部分,我们不仅要搜索users/uid,还要搜索users/cellerUid,并执行euqalTo(udi)条件。

Firebase 中的查询在单个平面节点上运行,其中 order/filter 的值必须位于每个直接子节点下的固定路径上。在 Firebase 中无法跨树的两个分支进行搜索。

像往常一样,在使用 NoSQL 数据库时,您将必须 modify/extend 您的数据模型以允许用例。在这里,您似乎需要一个新的顶级节点,将 UID(来自评论)映射到它们所属的聊天室:

chatRoomsByUID: {
  "QTC8Msw1n2aUF8mDbTCUNk5k7sH3": {
    "-Mn0ZDpdWsOb8XFFTYmi": true
  }
}

这种“索引”可以让用户轻松查找聊天室。

我还建议阅读我对以下内容的回答:

  • ,这本质上是一个变体
  • Firebase Query Double Nested