在我的应用程序中,我尝试获取所有可用的用户。为此,每个用户都有一个参数,要么是“真”,要么是“假”。我想返回该参数为“真”的用户数量。
在这种情况下,数据如下所示:
我试过这样做,代码被切到必要的部分:
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。为什么它不返回具有可用参数的所有用户的数量为真?
最佳答案
你需要使用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) {
}
});
来自docs :
public long getChildrenCount ()
Returns The number of immediate children in the this snapshot
当您使用 addChildEventListener
时,您在 dataSnapshot 内部循环,因此从 getChildrenCount()
中只得到 1。
在上面的代码中,datasnapshot 将返回 user
节点的快照,其中 available
等于 true
,然后当您添加listener 你将能够检索满足上述查询的节点 users
下的所有直接子节点的数量。
关于java - Firebase getChildrenCount() 总是返回 '1',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53470480/