Сортировка базы данных Firebase по времени неизвестного узла

Я пытаюсь получить во времени следующее:

Сортировка базы данных Firebase по времени неизвестного узла

Где известное значение - это текущий токен аутентифицированного пользователя, а неизвестное значение - это пользователь, который был создан ранее из серверной среды.

    mDatabase = FirebaseDatabase.getInstance().getReference("users");

    mDatabase.child("users").child(user.getUid());

    mDatabase.child(user.getUid()).addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {


            GenericTypeIndicator<Map<String, Object>> t = new GenericTypeIndicator<Map<String, Object>>() {
            };
            Map<String, Object> map = dataSnapshot.getValue(t);

            assert map != null;


            for (Object e : map.values()) {
                list.add(e.toString());
            }

            for (Object e : map.keySet()) {
                list1.add(e.toString());
            }

Я попытался использовать orderByChild ("time") в addValueEventListener, но я не думаю, что он работает, поскольку я не могу указать правильное место в базе данных, так как я не могу получить значение пользователя

Редактировать:

            try {
                for (int i = list1.size()-1; i == list1.size()-1; i++) {

                    String guestname = String.valueOf(dataSnapshot.child(list1.get(i)).child("username").getValue());
                    String guestemail = String.valueOf(dataSnapshot.child(list1.get(i)).child("email").getValue());
                    String guestpassword = String.valueOf(dataSnapshot.child(list1.get(i)).child("password").getValue());

                    Log.w(TAG, "Name of newest value is " + guestname);
                    Log.w(TAG, "Email of newest value is " + guestemail);
                    Log.w(TAG, "Password of newest value is " + guestpassword);
                    guestname1 = guestname;
                    guestpassword1 = guestpassword;
                    guestemail1 = guestemail;
                }

Ответ ниже. Но поскольку вы звоните в Firebase.setAndroidContext(this);, похоже, что вы используете очень старую версию Firebase SDK. Рассмотрим модернизация, чтобы получить улучшения, сделанные за последние два года.

Frank van Puffelen 27.03.2018 23:00

+1 Спасибо за это, да, не уверен, почему это было там, но думаю, что я уже использую последнюю версию .. В моем gradle: implementation 'com.google.firebase: firebase-database: 12.0.0'

user2921885 27.03.2018 23:06
0
2
241
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для этого вам нужно использовать orderByChild():

mDatabase = FirebaseDatabase.getInstance().getReference("users");

Query query = mDatabase.child(user.getUid()).orderByChild("time")

query.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for (dataSnapshot childNode: dataSnapshot.getChildren()) {
      System.out.printl(childNode.getKey()); //this is the unknown key you marked
      System.out.printl(childNode.child("time").getValue(Long.class));
    }
  }

  ...

+1 Спасибо, выглядит правильно, я никогда не видел childNode.key ни в каких документах, и я получаю сообщение об ошибке в Android Studio при использовании этого .. Не удается разрешить символ «ключ»? Любая идея

user2921885 27.03.2018 23:05

Уупс ... извините за это. Это должен был быть getKey() на Android. В последнее время я слишком много занимаюсь JavaScript.

Frank van Puffelen 27.03.2018 23:08

И последнее, не могли бы вы проверить мой отредактированный ответ, чтобы увидеть, как я раньше создавал хэш-карту, я действительно хочу поместить все узлы в хеш-карту, отсортированную по времени, а не только значения для времени. Я отредактировал вопрос, чтобы показать код ... спасибо

user2921885 27.03.2018 23:19

Наиболее важно использовать цикл, который у меня есть над dataSnapshot.getChildren(). Ваш код выполняет Map<String, Object> map = dataSnapshot.getValue(t), который теряет информацию для заказа (поскольку для него нет места на карте).

Frank van Puffelen 27.03.2018 23:23

Спасибо, если я потеряю порядок в хэш-карте, что лучше использовать, если я хочу получить все значения в неизвестном узле, который отсортирован по времени?

user2921885 27.03.2018 23:26

Используемый - это упорядоченная коллекция, такая как List, а затем преобразование из (упорядоченного) снимка в снимок с помощью кода, который я показал.

Frank van Puffelen 28.03.2018 00:06

Другие вопросы по теме