Извлечение указанных детей из базы данных Firebase в реальном времени - PullRequest
0 голосов
/ 13 мая 2019

Firebase Strucutre

Я пытаюсь получить Messages/child отсортировано на основе time. У меня есть доступ к Messages/child. Я не могу найти какое-либо полезное решение. Пожалуйста, помогите мне понять это.

Мой текущий код:

FirebaseDatabase.getInstance()
    .getReference()
    .child("Messages")
    .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
    .addChildEventListener(new ChildEventListener() {
          @Override
          public void onChildAdded(@NonNull DataSnapshot dataSnapshot,  @Nullable, String s) {

              Log.d("children",dataSnapshot.getKey());
              users_list.add(dataSnapshot.getKey());

          }

Ответы [ 3 ]

0 голосов
/ 13 мая 2019

Попробуйте это ..

DocumentReference docRef = FirebaseFirestore.getInstance().collection(YOUR_COLLECTION).document(FirebaseAuth.getInstance().getCurrentUser().getUid());
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {

                if (document.contains("message")) {
                        String message=document.get("message").toString());
                    }
                //add other information to your user_list
            }
        }
    }
});
0 голосов
/ 13 мая 2019

Насколько я вижу, у вас есть структура данных:

Messages: {
  uid1: {
    uid2: {
      messageId1: ...
      messageId2: ...
      messageId3: ...
    }
  }
}

Вы присоединяете ChildEventListener к /Messages/uid1, что означает, что ваш onChildAdded будет вызван для UID второго уровня пользователя из вашего JSON. Чтобы перейти к отдельным сообщениям, вам все равно нужно перебрать дочерние узлы DataSnapshot:

FirebaseDatabase.getInstance()
    .getReference()
    .child("Messages")
    .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
    .addChildEventListener(new ChildEventListener() {
          @Override
          public void onChildAdded(@NonNull DataSnapshot dataSnapshot,  @Nullable, String s) {
              for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
                  Log.d("message key: ", messageSnapshot.getKey());
                  Log.d("message time: ", messageSnapshot.child("time").getValue(String.class));
              }
          }

Несколько замечаний:

  • Как уже говорилось, этот код зацикливается на дочерних элементах DataSnapshot, чтобы добраться до отдельных сообщений.
  • Рассмотрите возможность хранения данных в виде чатов, в которых ключ каждой комнаты чата основан на UID ее участников, как описано здесь: Лучший способ управления каналами чата в Firebase
  • Вам нужно будет добавить свои сообщения в список и отсортировать их на стороне клиента.
  • Вы сохраняете время в виде отображаемой строки, что затрудняет их сортировку. Рекомендуется хранить их в формате, который легче сортировать, например, "20190513T073306" или отметку времени, например 1557758003677.
0 голосов
/ 13 мая 2019

вы можете сделать это так: -

mChatReference = FirebaseDatabase.getInstance().getReference("Messages")
                .child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        Query query = mChatReference.orderByChild("time");
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                   Log.d("children",dataSnapshot.getKey());
                users_list.add(dataSnapshot.getKey());            
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...