当前位置: 首页 > 知识库问答 >
问题:

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

徐飞龙
2023-03-14

我是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) {

                }
            });
        }
    }
});

共有1个答案

边永贞
2023-03-14

您正在循环数据,并在其中显示特定节点的toast。但是由于您的代码执行速度非常快,您可能只会看到代码生成的最后一个toast。

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

    < li >循环完成后,仅显示一条包含所有数据的toast消息。 < li >记录每个循环的值,以便您可以在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中设置断点,然后一步遍历代码,以更从容的速度查看发生了什么。:)

 类似资料:
  • 这是我的第二个版本,我试图从Firebase检索代码,并用它做一些事情。这是我的第二种方式: 这将崩溃,并出现错误代码: 未能将类型“__NSCFString”(0x10A77F4A0)的值强制转换为“NSDictionary”(0x10A780288)。在“更新”行。这是我的第一次尝试: 打印更多数据: -路径通道引用:可选(https://x.com/channels/-kegkajavh6u

  • 我正在尝试获取我的用户名,并在应用程序打开时向他/她问好。但我无法根据某个用户的uid获取数据。当我运行应用程序时,祝酒词从未真正出现。 数据库结构 密码

  • 我试图显示一个零件的"loc",如果它的零件号我给。以下是数据结构的样子: 活动代码: getLoc是Product类的getter函数,它返回给定curP对应的“loc”。curP部分表示子值。 逻辑对我来说似乎是正确的,但我没有得到输出。我哪里出了问题?

  • 所以我试着在springboot中读取一个excel文件,该excel文件包含10张表,代码成功地迭代了所有的表,但是行标题和单元格数据不正确,除了第一张表,即第二张到最后一张表都取了第一张表的信息 还有输出没有很好的安排,有没有一个方法让它干净 下面是代码 下面是输出的第1页=>partners 使用迭代器迭代行和列 第3页=>附表 使用迭代器迭代行和列

  • 我正在尝试用Firebase制作一个简单的Android应用程序。 目前,我只是试图从Firebase实时保存用户数据库。但由于某种原因它不起作用。另一方面,身份验证工作完美。 数据库本身没有显示任何内容。它总是显示“null” 我一直在关注这个YouTube教程,并一直在做一些类似的事情。 当我尝试创建一个用户并将其发送到数据库时,运行的程序没有给出任何答案。我有一个进度条,一旦setValue

  • 该库只支持Double、Boolean和String。我现在真困惑。怎么可能?