запрос orderByChild не работает на addListenerForSingleValueEvent Firebase - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь упорядочить свою базу данных по дочернему значению "Месяц", но orderByChild не работает. Это работает, когда я использую onChildEventListener вместо addListenerForSingleValueEvent Но я не хочу использовать childEventListener

Вот моя база данных

"Stats" : {
    "2019" : {
      "YxdZZHGy3rW4xdjORfk2i5mFRYG2" : {
        "August" : {
          "Weight" : {
            "Body_Fat" : "29",
            "Month" : 8,
            "Weight" : "68"
          }
        },
        "October" : {
          "Weight" : {
            "Body_Fat" : "29",
            "Month" : 10,
            "Weight" : "67"
          }
        },
        "September" : {
          "Weight" : {
            "Body_Fat" : "28.5",
            "Month" : 9,
            "Weight" : "65.5"
          }
        }
      }
    }
},

А вот код Java

 userStatsDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    Query query = userStatsDatabase.child(ds.getKey()).child("Weight").orderByChild("Month").limitToFirst(12);
                    query.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            if (dataSnapshot.exists()) {
                                Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
                                pastMonthsBodyFat = Float.parseFloat(map.get("Body_Fat").toString());
                                pastMonthsWeight = Float.parseFloat(map.get("Weight").toString());

                                pastWeightList.add(pastMonthsWeight);
                                pastBodyFatList.add(pastMonthsBodyFat);
                                Toast.makeText(Stats.this, map.get("Month").toString(), Toast.LENGTH_SHORT).show();
                            }
                        }

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

                        }
                    });
                }

Тост должен печатать значения месяцев в порядке 8,9,10, но он печатает значения 8,10,9

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Если userStatsDatabase указывает на этот JSON (для конкретного пользователя):

  {
    "August" : {
      "Weight" : {
        "Body_Fat" : "29",
        "Month" : 8,
        "Weight" : "68"
      }
    },
    "October" : {
      "Weight" : {
        "Body_Fat" : "29",
        "Month" : 10,
        "Weight" : "67"
      }
    },
    "September" : {
      "Weight" : {
        "Body_Fat" : "28.5",
        "Month" : 9,
        "Weight" : "65.5"
      }
    }
  }

Тогда вы можете получить результаты в порядке Month с:

Query query = userStatsDatabase..orderByChild("Weight/Month");
query.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    for (DataSnapshot monthSnapshot: dataSnapshot.getChildren()) {
      System.out.println(monthSnapshot.getKey()); // August, September, October
      System.out.println(monthSnapshot.child("Weight/Month").getValue(Long.class)); // 8, 9, 10
    }
  }
  ...
0 голосов
/ 04 октября 2019

Я перестал использовать запросы Firebase для сортировки данных, я уверен, что в моем коде нет ничего плохого, в любом случае я решил отсортировать его «после» добавления данных в arrayList с использованием Collections.sort, и это сработало. Спасибо

PS, если кто-то знает, почему мой запрос firebase не работает, я все равно хотел бы знать причину: S

Вот код на тот случай, если кому-то еще нужно отсортировать данные из arrayList

//sort the item  to show months in ascending order
Collections.sort(items, new Comparator<PastMonthsWeightStats>(){
    @Override
    public int compare(PastMonthsWeightStats obj1, PastMonthsWeightStats obj2) {
        // ## Ascending order
        // return obj1.firstName.compareToIgnoreCase(obj2.firstName); // To compare string values
        //return Float.valueOf(obj1.getMonthNumber()).compareTo(Float.valueOf(obj2.getMonthNumber())); // To compare integer values

        // ## Descending order
        // return obj2.firstName.compareToIgnoreCase(obj1.firstName); // To compare string values
        return Integer.valueOf(obj2.getMonthNumber()).compareTo(Integer.valueOf(obj1.getMonthNumber())); // To compare integer values
    }
});     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...