Firebase startAt возвращает ноль при получении данных - PullRequest
0 голосов
/ 29 апреля 2020

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

enter image description here

На изображении я хочу получить все данные, которые начинаются с ключевого слова "jsonmat ".

Я использую код ниже, но он всегда возвращает ноль:

DatabaseReference db = FirebaseDatabase.getInstance().getReference()
        .child("Events");
db.startAt("jsonmat").addListenerForSingleValueEvent(
        new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
            Log.i("events", dataSnapshot.toString());
            for (DataSnapshot data : dataSnapshot.getChildren()) {
              // here the user will have the specified email only
            }

          }

          @Override
          public void onCancelled(DatabaseError databaseError){
            Log.i("MyApp", "getUser:onCancelled", databaseError.toException());
          }

        });

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

То, что вы можете сделать для своего случая, это l oop 2 раза над дочерними узлами Events:

//the reference to the node Events

DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("Events");


db.addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {

            //loop 1
            for (DataSnapshot data : dataSnapshot.getChildren()) {

                //loop2

             for (DataSnapshot dataTwo : data.getChildren()) {
             //get the key
              String key = dataTwo.getKey();

              if(key.startsWith("jsonmat")){
              //we got a matching key so extract the data and maybe put them in a list

               boolean active = dataTwo.child("active").getValue(Boolean.class);

               int bet = dataTwo.child("bet").getValue(Integer.class);

               String challenger = dataTwo.child("challenger").getValue(String.class); 

               String competitor = dataTwo.child("competitor").getValue(String.class);   

               String game = dataTwo.child("game").getValue(String.class); 

               ............
               ............
               ............     
              }else{
              //we didn't get a match 

              }


             }//end loop2

            }//end loop1

          }

          @Override
          public void onCancelled(DatabaseError databaseError){
            Log.i("MyApp", "getUser:onCancelled", databaseError.toException());
          }

        });
0 голосов
/ 29 апреля 2020

То, что вы пытаетесь сделать, невозможно. Вы не можете упорядочить / отфильтровать вложенный ключ, только по прямым дочерним ключам (-M...) и по вложенным значениям (active: true).

Как правило, вы захотите создать новый верхний уровень узел, где вы храните ключи, которые вы ищете, а затем ключи pu sh для каждого соответствующего вложенного узла:

"category_things": {
  "jsonmat_jsonmat": {
    "-M62....uYgB": true,
    "-M62....2-eO": true
  }
}

Также см .:

Мой оригинальный, но неправильный ответ приведен ниже ...

Если вы используете startAt без указания предложения orderBy... , данные будут упорядочены по приоритету. Этот приоритет перенесен до того, как Firebase поддерживал упорядочение по указанным c свойствам, поэтому в основном это означает, что необходимо вызвать метод orderBy... перед фильтрацией.

Итак:

DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("Events");
db.orderByKey().startAt("jsonmat").addListenerForSingleValueEvent(new ValueEventListener() {
    ...

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