如何查找指定数据,如 Firebase 实时数据库中给定的 JSON 树中所述



在以下友元请求的JSON结构中,"LONiSEYOArTUAYF2CJ2zf6EzpqC"是当前用户ID。它具有他已接收请求或已向其发送请求的用户的嵌套用户 ID。现在我想获取所有嵌套用户的 userId,这些用户在 Android 中向当前用户发送了 ID 为"LONiSEYOArTUAYF2CJ2zf6EzpqC"的请求。

我已经在安卓中尝试了以下代码。

Database Reference mRequestDatabase = FirebaseDatabase.getInstance().getReference().child("Requests").child(currentUserId);
Query query = 
mRequestDatabase.orderByChild("request_type").equalTo("received");

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

{
  "Requests" : {
     "LONiSEYOArTUAYF2CJ2zf6EzpqC":{
        "anicGIuuLSQndxMKI8ieZDhMHOP":{
          "request_type" : "received"
        },
        "TIh83WLasxYxLxJmUh619imfnrd" :{
          "request_type" : "received"
        }
      } 
      ,
      "LioCIXTY8_Cgii2TtHb" : {
         "NthWyK6XoLdAOZCdmkJXIGS3YuR2" : {
           "request_type" : "received"
         }
      }
      ,
      "91cGZGssoTQOoepy" :{
        "NthWyK6XoLdAOZCdmkJXIGS3YuR2" : {
           "request_type" : "send"
         }

      }

    }
}

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

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;
    }
}

最新更新