我在Firebase中有以下数据库结构:
我想从" chats"中检索所有对象。如果在"用户"对象包含键" user2"。 是否可以在不更改Firebase结构的情况下下载数据?
我实际获取数据的代码:
DatabaseReference chatReference = FirebaseDatabase.getInstance().getReference("conversationsNew");
chatReference.orderByChild("users").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d("TAG", dataSnapshot.getChildrenCount());
for (DataSnapshot chat : dataSnapshot.getChildren()) {
Log.d("TAG", chat.toString());
Chat chat = chat.getValue(Chat.class);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
非常感谢。
答案 0 :(得分:0)
不,使用您的代码无法实现此目的。你能做些什么,就是通过添加一个像这样的新节点来改变你的数据库结构:
Firebase-root
--- users
--- userId1
--- userName: John
--- chats
--- chat1: true
有了这个,您可以查询您的数据库以获取您的用户所属的聊天记录。要验证是否存在,只需在exists()
对象上使用dataSnapshot
方法。
希望它有所帮助。
答案 1 :(得分:0)
这很可能:
DatabaseReference chatReference = FirebaseDatabase.getInstance().getReference("chats");
chatReference.orderByChild("users/user1").equalTo(true).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot chat: dataSnapshot.getChildren()) {
Log.d("TAG", chat.getKey());
Chat chat = chat.getValue(Chat.class);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
});
这将打印:
客服1
但是这种方法无法扩展,因为您需要为每个用户添加索引。为了防止这种情况,您需要一个更接近于此的数据结构用例。所以:如果你想显示当前用户所在的聊天列表,你需要准确地存储:每个用户的聊天列表。亚历克斯'答案显示了存储此类数据的最常用方式。