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

Posted

技术标签:

【中文标题】我想设置firebase实时数据库或条件语句【英文标题】:I want to set the firebase real-time database or conditional statement 【发布时间】: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) 条件。

【问题讨论】:

【参考方案1】:

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

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

chatRoomsByUID: 
  "QTC8Msw1n2aUF8mDbTCUNk5k7sH3": 
    "-Mn0ZDpdWsOb8XFFTYmi": true
  

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

我还建议阅读我的回答:

Firebase query if child of child contains a value,这本质上是一个变体 Firebase Query Double Nested

【讨论】:

以上是关于我想设置firebase实时数据库或条件语句的主要内容,如果未能解决你的问题,请参考以下文章

与 firebase 实时数据库定价模型相关的困惑

Firebase 实时规则

无法读取或写入firebase实时数据库(android studio)。

Firebase 实时数据库能否有效地循环浏览数十亿条帖子并由发布它们的用户检索?

如果不同的条件为真,Firebase 如何打破具有不同状态/消息的实时数据库事务?

将 Metabase 与 Firebase 实时数据库一起使用进行数据分析 [关闭]