【问题标题】:I want to set the firebase real-time database or conditional statement我想设置firebase实时数据库或条件语句
【发布时间】:2021-12-12 18:31:09
【问题描述】:

我正在制作一个聊天应用程序。人 A 向 B 发送一条消息,在 A 的设备上查看聊天室时可以清楚地看到该消息。但是当我去B的设备看聊天窗口时,却看不到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) {

    }
});

这在B的设备上显示了A的消息,远远没有解决问题。

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

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

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

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

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

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

    这种“索引”使查找用户的聊天室变得容易。

    我还建议阅读我的回答:

    【讨论】:

      猜你喜欢
      • 2015-12-08
      • 2019-01-18
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多