Как найти указанные данные, как описано в данном дереве JSON в базе данных Firebase Realtime? - PullRequest
0 голосов
/ 11 июля 2019

В следующей структуре запросов дружбы JSON "LONiSEYOArTUAYF2CJ2zf6EzpqC" является текущим идентификатором пользователя. Он имеет вложенные идентификаторы пользователей, от которых он получил запросы или отправил запрос. Теперь я хочу получить идентификаторы всех вложенных пользователей, которые отправили запрос текущему пользователю с идентификатором "LONiSEYOArTUAYF2CJ2zf6EzpqC" в Android.

Я пробовал следующий код в Android.

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

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

Но этот запрос не работает, так как ссылка на базу данных относится к currentUserId. Как перебрать всех пользователей под текущим идентификатором пользователя и проверить, у кого request_type = "полученный"?

{
  "Requests" : {

     "LONiSEYOArTUAYF2CJ2zf6EzpqC":{
        "anicGIuuLSQndxMKI8ieZDhMHOP":{
          "request_type" : "received"
        },

        "TIh83WLasxYxLxJmUh619imfnrd" :{
          "request_type" : "received"
        }

      } 
      ,
      "LioCIXTY8_Cgii2TtHb" : {
         "NthWyK6XoLdAOZCdmkJXIGS3YuR2" : {
           "request_type" : "received"
         }

      }
      ,
      "91cGZGssoTQOoepy" :{

        "NthWyK6XoLdAOZCdmkJXIGS3YuR2" : {
           "request_type" : "send"
         }


      }


    }

}

1 Ответ

0 голосов
/ 11 июля 2019

Ваш запрос выглядит нормально. Если вы хотите получить ключи запросов с 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...