Firebase Android通过子键获取值

时间:2017-09-07 10:53:02

标签: java android firebase firebase-realtime-database

我在Firebase中有以下数据库结构:

firebase structure

我想从" 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) {

            }
        });

非常感谢。

2 个答案:

答案 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

但是这种方法无法扩展,因为您需要为每个用户添加索引。为了防止这种情况,您需要一个更接近于此的数据结构用例。所以:如果你想显示当前用户所在的聊天列表,你需要准确地存储:每个用户的聊天列表。亚历克斯'答案显示了存储此类数据的最常用方式。