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



我正在制作一个聊天应用程序。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) {
}
});

这是A在B的设备上的信息,这远远不能解决问题。

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

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

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

与往常一样,当使用NoSQL数据库时,您将不得不修改/扩展您的数据模型以允许用例。这里,您似乎需要一个新的顶级节点,将uid(从注释)映射到它们所属的聊天室:
chatRoomsByUID: {
"QTC8Msw1n2aUF8mDbTCUNk5k7sH3": {
"-Mn0ZDpdWsOb8XFFTYmi": true
}
}

这种"索引"这样就可以方便地为用户查找聊天室。

我还建议阅读我对以下问题的回答:

  • Firebase查询如果child的child包含一个值,这实际上是一个变量
  • Firebase查询双嵌套

最新更新