【问题标题】:Firebase Android get value by child keyFirebase Android 通过子键获取值
【发布时间】:2017-09-07 10:53:02
【问题描述】:

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

如果“用户”对象中包含键“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) {

            }
        });

非常感谢。

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    这很有可能:

    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

    但这种方法无法扩展,因为您需要为每个用户添加一个索引。为防止这种情况,您需要一个更能反映用例的数据结构。所以:如果你想显示当前用户所在的聊天列表,你需要精确地存储:每个用户的聊天列表。 Alex 的回答显示了存储此类数据的最常见方式。

    【讨论】:

      【解决方案2】:

      不,不可能使用您的代码实现此目的。相反,您可以做的是通过添加这样的新节点来稍微改变您的数据库结构:

      Firebase-root
          --- users
            --- userId1
              --- userName: John
              --- chats
                --- chat1: true
      

      有了这个,您可以查询您的数据库以获取您的用户所属的聊天。要验证是否存在,您只需在 dataSnapshot 对象上使用 exists() 方法。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2019-12-20
        • 2018-04-16
        • 2018-10-15
        • 2019-05-03
        • 2019-02-01
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多