无法通过Firebase实时数据库正确迭代

问题描述 投票:0回答:1

我对android studio和firebase还是很陌生,但在从firebase实时数据库中检索特定键值时遇到问题。

因此,我在firebase实时数据库中有一个用户数组,我想遍历整个数组,但是每当我按下“下一步”按钮直到数组末尾时,我都会“移动”一次迭代器。

这不是静态的,也就是说,数组的大小可以更改。

[当我移动迭代器时(当我按下按钮时),我想从该用户的Firebase实时数据库中获取“状态”消息(当我第一次按下按钮时,下一个迭代器将为1,并且我想获取该消息的状态消息密钥的用户为1,依此类推。)

抱歉,不能让我发布图像

我的firebase数据库的链接:

“”

下面的代码有效,但是它总是返回加入该数组的最后一个用户的“状态”值。

我的代码如下:

next.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(current_person < number_of_people_in_the_row){
            current_person++;

            current_person.setText(String.valueOf(current_person));

            final String current_person_string = String.valueOf(current_person );

            DatabaseReference user = db.getReference("Redovi").child("Aktivni").child(pin);
            user.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot current_user: dataSnapshot.getChildren()){
                        current_user.child(current_person_string);

                        for(DataSnapshot current_user_data: current_user.getChildren()){
                            String current_user_status = current_user_data.child("status").getValue().toString();

                            Toast.makeText(RedomatAdmin.this, current_user_status, Toast.LENGTH_SHORT).show();

                        }
                    }
                }

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

                }
            });
        }
    }
});

android firebase firebase-realtime-database
1个回答
0
投票

您正在遍历数据,并为其中的某些节点显示敬酒。但是,由于您的代码将很快执行,因此您可能最终只会看到代码生成的最后一次敬酒。

Toast消息不适用于调试,因此,我强烈建议为此目的切换到Log调用。在下面的代码中,我做了两个更改:

  1. 循环完成后,仅显示一条带有所有数据的祝酒消息。
  2. 记录每个循环的值,以便您可以在logcat输出中找到它们。
DatabaseReference user = db.getReference("Redovi").child("Aktivni").child(pin);
user.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String toast = "";
        for(DataSnapshot current_user: dataSnapshot.getChildren()){
            String current_user_key = current_user.getKey();
            Log.d("NEXT", "Handling user "+current_user_key);
            for(DataSnapshot current_user_data: current_user.getChildren()){
                String current_user_status = current_user_data.child("status").getValue().toString();

                Log.d("NEXT", "Handling data "+current_user_data.getKey()+" status="+current_user_status);

                toast = toast + current_user_key + " = " + current_user_status + ", ";
            }
        }
        Toast.makeText(RedomatAdmin.this, toast, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors please
    }
});

甚至更好的方法是学习在Android Studio中使用交互式调试器,在onDataChange中设置一个断点,然后逐步执行代码以更轻松地了解发生了什么。 :)

热门问题
推荐问题
最新问题