Firebase .getvalue не в том же порядке, что и база данных

#java #firebase #firebase-realtime-database

# #java #огневая база #firebase-база данных в реальном времени

Вопрос:

Моя база данных Firebase выглядит следующим образом

База данных Firebase

Когда была запущена приведенная ниже кодировка:

 String loc=(snapshot.child("loc").getvalue()).tostring();
 

Выходные данные, которые я получаю, имеют разную последовательность с базой данных:

Вывод

Почему это так?

Комментарии:

1. Важен ли порядок?

2. Да, порядок очень важен.

3. можете ли вы показать ссылку на базу данных firebase, я думаю, что ваша ссылка на firebase указывает не на тот узел

4. @jwen Тогда почему вы не используете child("loc").orderByKey() ?

5. @cricket_007 виноват, дело сделано. Большое вам спасибо.

Ответ №1:

Данные Firebase хранятся в формате JSON и по своей сути неупорядочены.

Если вы хотите получить доступ к данным в определенном порядке, вы должны указать orderBy предложение для своего запроса и получить доступ к данным, используя метод моментального getChildren() снимка.

Допустим, вы хотите регистрировать элементы по возрастанию ключа:

 DatabaseReference rootRef = FirebaseDatabase.getInstance().getRef();
Query locations = rootRef.orderByKey();
locations.addListenerForSingleValueEvent(new ValueEventListener() {
  public void onDataChange(DataSnapshot snapshot) {
    for (DataSnapshot locSnapshot: snapshot.getChildren()) {
        System.out.println(locSnapshot.getKey()   ": "   locSnapshot.getValue(String.class));
    }
  }

  public void onCancelled(DatabaseError databaseError) {
    Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
    // ...
  }
});
 

Этот пример взят (изменен) из документации Firebase по спискам чтения данных.

Ответ №2:

Фрэнк опередил меня в моем редактировании, проверьте его правильное решение, используя orderBy....


Вам нужно использовать forEach , а не child метод (или child.foreach )

Вот фрагмент из документа:

Из-за того, как работают объекты JavaScript, порядок данных в объекте JavaScript, возвращаемом val(), не гарантируется, что он соответствует порядку на сервере или порядку событий child_added . Вот где forEach() пригодится. Это гарантирует, что дочерние элементы DataSnapshot будут повторяться в порядке их запроса.

Источник: https://firebase.google.com/docs/reference/js/firebase.database .DataSnapshot#forEach

Комментарии:

1. Это вопрос Java. Почему вы цитируете библиотеку JavaScript?

2. Я имел в виду больше, что forEach это не метод Java API

3. Правильно, позвольте мне это исправить.