Firebase getChildrenCount () всегда возвращает «1» - PullRequest
0 голосов
/ 25 ноября 2018

В моем приложении я пытаюсь выбрать всех доступных пользователей.Для этого у каждого пользователя есть параметр, который имеет значение «true» или «false».Я хочу вернуть количество пользователей, для которых этот параметр имеет значение «true».

В этом случае данные выглядят так: data structure

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

public class MainActivity extends AppCompatActivity {

    private DatabaseReference mDatabase, mUsers;
    private FirebaseAuth mAuth;
    private FirebaseUser firebaseUser;

    private String userID;

    private Button startButton;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAuth = FirebaseAuth.getInstance();

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

        startButton = (Button) findViewById(R.id.button);



        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Query allAvailable = mUsers.orderByChild("available").equalTo("true");

                allAvailable.addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                        if (dataSnapshot.exists()) {

                            long xy = dataSnapshot.getChildrenCount();
                            Toast.makeText(MainActivity.this, String.valueOf(xy), Toast.LENGTH_SHORT).show();   
                        }

                    }

                });

            }
        });

    }
}

Однако я пытаюсь это сделать, getChildrenCount() всегда возвращает значение 1. Почему он не возвращает количество всех пользователей, у которых есть доступный параметрэто правда?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

используйте переменную count, чтобы подсчитать, сколько доступно, а затем показать, что-то вроде этого

            Int count = 0;
        FirebaseDatabase.getInstance().getReference("users")
        .addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                Users us = snapshot.getValue(Users.class);
                String status = user.getAvailability();

                if (status.equalsIgnoreCase("true")) {
                    count++;
                } else {
                    //anything you wanna do here
                }

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

            }
        });
0 голосов
/ 25 ноября 2018

Вам необходимо использовать ValueEventListener:

mUsers = FirebaseDatabase.getInstance().getReference().child("users");
Query allAvailable = mUsers.orderByChild("available").equalTo("true");

reference.addValueEventListener(new ValueEventListener() {
  @Override
public void onDataChange(DataSnapshot dataSnapshot) {
     long xy = dataSnapshot.getChildrenCount();
}
  @Override
public void onCancelled(DatabaseError databaseError) {
  }
});

Из документов :

public long getChildrenCount ()

Возвращаетчисло непосредственных потомков в этом снимке

Когда вы используете addChildEventListener, вы зацикливаетесь внутри dataSnapshot и, таким образом, получаете только 1 в результате getChildrenCount().

InВ приведенном выше коде datasnapshot вернет снимок узла user, где available равен true, затем при добавлении прослушивателя вы сможете получить количество всех прямых дочерних элементов под узлом usersкоторые удовлетворяют вышеуказанному запросу.

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