在推送任何更改之前,如何从Firebase数据库中检索某些字段?

时间:2017-03-01 05:58:12

标签: android firebase firebase-realtime-database

目前我创建了一个Listing对象并在其中存储了一堆字段。我需要存储的两个字段是当前用户的电子邮件和名称。我想把这两个字段改为如下

        dbRef = database.getReference().child("Users").child(emailKey);
        dbRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            UserInfo userIn = dataSnapshot.getValue(UserInfo.class);
            email1 = userIn.email;
            sellerName = userIn.username;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

在这段代码之后我有了一行

    DatabaseReference temp = dbRefL.push();
    temp.setValue(l);

我按下按钮调用所有这些代码。我第一次按下按钮时,整个Listing对象就按照我想要的方式推送到Firebase除了用户电子邮件和用户名不在那里因为它们是空白的。我第二次按下按钮,字符串就在我想要的地方。

我的猜测是因为OnDataChange仅在我推送Listing对象后执行。这是真的?在推送列表对象之前,如何让OnDataChange执行?

2 个答案:

答案 0 :(得分:0)

侦听器onDataChange()回调是异步的。您的电子邮件和用户名为空的原因是onDataChange尚未执行,以确保在检索到电子邮件和用户名后推送数据,请将代码放入onDataChange()

dbRef = database.getReference().child("Users").child(emailKey);
        dbRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            UserInfo userIn = dataSnapshot.getValue(UserInfo.class);
            email1 = userIn.email;
            sellerName = userIn.username;

            //set up your l value
            DatabaseReference temp = dbRefL.push();
            temp.setValue(l);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

按下上面的按钮后,应调用代码获取电子邮件和用户名,然后根据需要推送数据。

答案 1 :(得分:0)

用户addValueEvenListener,如:

 DatabaseReference map = database.getReference("field_name");
    map.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            String data = (String) dataSnapshot.getValue();


        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
                           ****OR using****


database.getReference("field_name").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.e(TAG, "Field data", dataSnapshot.getValue(String.class));
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            // Failed to read value
            Log.e(TAG, "Failed to read user", databaseError.toException());
        }
    });