我正在制作一個聊天應用程式。人 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) 條件。
uj5u.com熱心網友回復:
Firebase 中的查詢在單個平面節點上運行,其中要排序/過濾的值必須位于每個直接子節點下的固定路徑上。無法在 Firebase 中搜索樹的兩個分支。
像往常一樣使用 NoSQL 資料庫時,您必須修改/擴展資料模型以允許用例。在這里,您似乎需要一個新的頂級節點,將 UID(來自評論)映射到它們所屬的聊天室:
chatRoomsByUID: {
"QTC8Msw1n2aUF8mDbTCUNk5k7sH3": {
"-Mn0ZDpdWsOb8XFFTYmi": true
}
}
這種“索引”使得查找用戶的聊天室變得容易。
我還建議閱讀我的回答:
- Firebase 查詢 child 的 child 是否包含一個 value,這本質上是一個變體
- Firebase 查詢雙重嵌套
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340281.html
上一篇:Firestore過濾器范圍日期
