如何在 Firebase 实时数据库中找到给定 JSON 树中描述的指定数据?

Posted

技术标签:

【中文标题】如何在 Firebase 实时数据库中找到给定 JSON 树中描述的指定数据?【英文标题】:How to find the specified data as described in given JSON tree in Firebase Realtime Database? 【发布时间】:2019-11-21 13:07:52 【问题描述】:

在以下好友请求的 JSON 结构中,“LONiSEYOArTUAYF2CJ2zf6EzpqC”是当前用户 ID。它嵌套了用户的用户 ID,他从这些用户中接收到请求或向其发送了请求。现在我想获取所有嵌套用户的用户 ID,这些用户在 android 中向当前用户发送了请求,ID 为“LONiSEYOArTUAYF2CJ2zf6EzpqC”。

我在 Android 中尝试过以下代码。

Database Reference mRequestDatabase = FirebaseDatabase.getInstance().getReference().child("Requests").child(currentUserId);

Query query = 
mRequestDatabase.orderByChild("request_type").equalTo("received");

但是这个查询不起作用,因为数据库引用是currentUserId。如何遍历当前用户 ID 下的所有用户并检查哪些有 request_type = "received"?


  "Requests" : 

     "LONiSEYOArTUAYF2CJ2zf6EzpqC":
        "anicGIuuLSQndxMKI8ieZDhMHOP":
          "request_type" : "received"
        ,

        "TIh83WLasxYxLxJmUh619imfnrd" :
          "request_type" : "received"
        

       
      ,
      "LioCIXTY8_Cgii2TtHb" : 
         "NthWyK6XoLdAOZCdmkJXIGS3YuR2" : 
           "request_type" : "received"
         

      
      ,
      "91cGZGssoTQOoepy" :

        "NthWyK6XoLdAOZCdmkJXIGS3YuR2" : 
           "request_type" : "send"
         


      


    


【问题讨论】:

为什么说你的查询不起作用?你添加了监听器吗? 【参考方案1】:

您的查询似乎很好。如果要获取当前用户request_type等于"received"的请求的key,可以通过如下方式获取key:

DatabaseReference requestDatabase = FirebaseDatabase.getInstance().getReference()
        .child("Requests")
        .child(currentUserId);

final List<String> senderUserIds = new ArrayList();

requestDatabase.orderByChild("request_type").equalTo("received")
        .addValueEventListener(new ValueEventListener() 
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
        for (DataSnapshot requestSnapshot : dataSnapshot.getChildren()) 
            senderUserIds.add(requestSnapshot.getKey());
        
    

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) 

    
);

推荐

如果你能够改变数据库的结构,你可以像这样展平它:


    "Requests": 
        "request_id_1": 
            "sender_user_id": "user_1",
            "recipient_user_id": "user_2"
        
    

那么,你可以这样查询:

DatabaseReference requestsRef = FirebaseDatabase.getInstance().getReference().child("Requests");

final List<String> senderUserIds = new ArrayList();

requestsDatabase.orderByChild("recipient_user_id").equalTo(currentUserId).addValueEventListener(new ValueEventListener() 

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
        for (DataSnapshot itemSnapshot : dataSnapshot.getChildren()) 
            Request request = itemSnapshot.getValue(Request.class);
            senderUserIds.add(request.getSenderUserId());
        
    

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) 

    
);

这是Request 类:

public class Request 

    private String senderUserId;
    private String recipientUserId;

    Request() 
        // Default constructor required for calls to DataSnapshot.getValue(Request.class)
    

    Request(String senderUserId, String recipientUserId) 
        this.senderUserId = senderUserId;
        this.recipientUserId = recipientUserId;
    

    public String getSenderUserId() 
        return senderUserId;
    

    public void setSenderUserId(String senderUserId) 
        this.senderUserId = senderUserId;
    

    public String getRecipientUserId() 
        return recipientUserId;
    

    public void setRecipientUserId(String recipientUserId) 
        this.recipientUserId = recipientUserId;
    

【讨论】:

非常感谢。这非常有用。

以上是关于如何在 Firebase 实时数据库中找到给定 JSON 树中描述的指定数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中从firebase实时数据库中获取数据?

如何在Firebase实时数据库中保存LocalData?

如何从 Firebase 实时数据库中获取数据到 Flutter 中的列表中?

Firebase : Firestore : 在实时数据库中找到的 ChildEventListener 的等价物是啥

Firebase 实时数据库:如何在按值排序后围绕特定键检索 10 条记录?

Swift 中的 Firebase 实时数据库