【问题标题】:Cannot iterate correctly through firebase realtime database无法通过 firebase 实时数据库正确迭代
【发布时间】:2020-05-11 11:55:05
【问题描述】:

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

                }
            });
        }
    }
});

【问题讨论】:

  • “总是返回最后一个加入数组的用户的“状态”值是什么意思。”?你得到一个结果?
  • @Karlo 你每次按下按钮都会得到一个结果,或者你只是在新用户加入阵列时得到 Toast 消息?
  • @AlexMamo 在我发布的图片中我有 5 个用户,每次单击“下一步”按钮时,我都会得到数组中第 5 个用户的吐司“状态”,如果我要再添加 3 个用户并手动将数据库中第 8 个用户的状态更改为“非活动”,我将始终只获得第 8 个用户的状态。
  • @P5music 当我按下“下一步”按钮时,我想获取该用户的“状态”消息(因此该特定用户的单个状态消息),这里我使用 toast 来检查是否我得到了正确的值。
  • @Karlo 如果你的代码 sn -p 只是一个检查,似乎你手动更改值时发出了 Toast,所以它是最后一个值。如果没有提供您的真实代码,请提供原始代码或sn-p。

标签: android firebase firebase-realtime-database


【解决方案1】:

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

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

  1. 循环完成后,仅显示一条包含所有数据的 Toast 消息。
  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 中设置断点,然后单步执行代码以更轻松地查看发生了什么。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2018-03-26
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多