首页 > 解决方案 > 来自 Firebase 实时数据库的 equalTo 数据快照返回空值

问题描述

当用户启动活动时,应该弹出一个包含父节点的 Toast,其中“drinkManufacturerID”的值等于给定的字符串。但是,在 Toast 中返回了一个空值。

相关代码:

public class DealRawDataActivity extends AppCompatActivity {

DatabaseReference databaseDrinks;

String keys;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_deal_raw_data);

    databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");

    databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot datas : dataSnapshot.getChildren()) {
                keys = datas.getKey();
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

   Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
}

}

Firebase 实时数据库结构: 在此处输入图像描述

标签: javaandroidfirebasefirebase-realtime-databaseandroid-toast

解决方案


当尝试在回调之外显示包含变量值的 Toast 消息时keys,您总是会得到,null因为它onDataChange()具有异步行为。因为该方法立即返回,所以keys您尝试显示的变量的值尚未从回调中填充。无法保证需要多长时间。因此,在数据可用之前可能需要几百毫秒到几秒钟。

快速解决此问题的方法是使用移动以下代码行:

Toast.makeText(this, keys, Toast.LENGTH_LONG).show();

在 for 循环结束之后,否则我建议您从这篇文章中查看我的 anwser 的最后一部分,其中我已经解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地理解。

编辑:请看下面的整个代码:

public class DealRawDataActivity extends AppCompatActivity {
    DatabaseReference databaseDrinks;
    String keys;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_deal_raw_data);
        databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");
        databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot datas : dataSnapshot.getChildren()) {
                    keys = datas.getKey();
                }
                Toast.makeText(this, keys, Toast.LENGTH_LONG).show(); //Should work!!
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}

推荐阅读