如何计算查询/ dataSnapshot?

时间:2019-06-16 13:04:24

标签: java android firebase firebase-realtime-database

我想显示StartActivity中的活动用户数。用户分为两组:选手和观众。我在数据库中使用布尔值尝试了它。如何显示/统计用户?

数据库: Firebase Pic StartActivity: XML Pic

这是我的StartAytivity.class代码:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_start);

        Button run = findViewById(R.id.button2);
        run.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(StartActivity.this, MainActivity.class);
                startActivity(intent);
            }
        });

        FirebaseApp.initializeApp(this);

        watcher = findViewById(R.id.textView3);
        player = findViewById(R.id.textView4);

        onlineCount();
    }

这是我的OnlineCount代码:

public void onlineCount(){
        //watcher
        refwatcher = FirebaseDatabase.getInstance()
                .getReference("online_list")
                .child("watcher")
                .child(Objects.requireNonNull(FirebaseAuth.getInstance().getCurrentUser()).getUid()).child("online");

        Query query = refwatcher.orderByChild("online").equalTo(true);


        refwatcher.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                wcount = (int) dataSnapshot.getChildrenCount();

                watcher.setText(getString(wcount) + getText(R.string._29_349_watchers_online));


            }

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

            }
        });

        //player
        DatabaseReference refplayer = FirebaseDatabase.getInstance().getReference("online_list").child("player");

        refplayer.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                player.setText("1" + getText(R.string._230_player_online));
            }

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

            }
        });
    }

这是我的调试代码:

   Caused by: java.lang.NullPointerException
        at java.util.Objects.requireNonNull(Objects.java:203)
        at com.bbinktattoo.nerve.StartActivity.onlineCount(StartActivity.java:65)
        at com.bbinktattoo.nerve.StartActivity.onCreate(StartActivity.java:57)
        at android.app.Activity.performCreate(Activity.java:7326)
        at android.app.Activity.performCreate(Activity.java:7317)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)

2 个答案:

答案 0 :(得分:1)

您的问题与您的问题所暗示的问题无关。您想知道如何计算数据库条目。 firebase中的每个元素都是一个节点,可以有 n 个子元素,父元素恰好是 1 个。节点与其父节点之间的关系是 1:1 ,而节点与其子节点之间的关系是 1:n

因此,如果要计算元素数量,则必须在父节点上调用getChildren()方法,该方法将返回对 n 节点的 n 引用。

但是,似乎您没有按照预期的那样初始化Firebase SDK。确保您阅读并理解相关文档 https://firebase.google.com/docs/android/setup

我猜您没有设置正确的配置参数

答案 1 :(得分:0)

您的问题不是计数本身,而是您的应用程序中Firebase似乎设置不正确。确保逐步遵循official guide。还要检查Logcat中是否有Firebase的错误和警告,通常有一些有用的东西。