来自Firebase Realtime数据库的equalTo数据快照,返回空值

时间:2019-02-21 15:00:04

标签: java android firebase firebase-realtime-database android-toast

当用户开始活动时,应该弹出一个Toast,其中包含父节点,其中“ drinkManufacturerID”值等于给定的String。但是,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实时数据库结构: s.map()

1 个答案:

答案 0 :(得分:1)

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

对此问题的快速解决方案是使用以下代码行:

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

在for循环结束后,否则,建议您从 post 中查看anwser的最后一部分,其中我已解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。

编辑:请在下面查看完整代码:

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

            }
        });
    }
}