我在 Firebase 中有以下数据库结构:
如果“users”对象中包含键“user2”,我想从“chats”中检索所有对象。 是否可以在不改变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) {
}
});
非常感谢。
最佳答案
这很有可能:
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
}
});
这将打印:
chat1
但是这种方法无法扩展,因为您需要为每个用户添加一个索引。为了防止这种情况,您需要一个更能反射(reflect)用例的数据结构。因此:如果您想显示当前用户所在的聊天列表,您需要精确存储:每个用户的聊天列表。 Alex 的回答展示了存储此类数据的最常见方式。
关于java - Firebase Android 通过子键获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46094514/