【问题标题】:equalTo datasnapshot from Firebase Realtime database returning null value来自 Firebase 实时数据库的 equalTo 数据快照返回空值
【发布时间】:2019-02-21 15:00:04
【问题描述】:

当用户启动活动时,应该弹出一个包含父节点的 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 实时数据库结构:

【问题讨论】:

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


    【解决方案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) {
    
                }
            });
        }
    }
    

    【讨论】:

    • 我应该把吐司准确地移到哪里才能让它工作?
    • 啊是的,我发现了我的问题。我不得不用“getApplicationContext()”替换“this”。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2020-03-25
    • 2021-03-26
    相关资源
    最近更新 更多