【问题标题】:Getting null value after getting the actual value获取实际值后获取空值
【发布时间】:2020-05-15 16:56:49
【问题描述】:
patient=mFirebaseAuth.getCurrentUser();
databaseReference=FirebaseDatabase.getInstance().getReference("Patients");
        Query query= databaseReference.orderByChild(patient.getUid());
                query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()){
                   deviceId= String.valueOf(ds.child("devID").getValue());
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    databaseReferences= FirebaseDatabase.getInstance().getReference(deviceId).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()){
                mbt= String.valueOf(ds.child("BT").getValue());
                Log.d("myTag", "This is my message"+mbt);
                Toast.makeText(getApplicationContext(),"Hi"+mbt,Toast.LENGTH_SHORT).show();
                bt.setText(mbt);
            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

日志

D/myTag: This is my message98.9
D/myTag: This is my messagenull

在这里,首先在 Log 和 toast 中,我得到了一段时间的实际值,一段时间后它变为 null。我的控制台和代码截图是

我的 firebase 数据库结构是...

    {
  "123456" : {
    "BT" : 98.9,
    "DBP" : 80,
    "HR" : 90,
    "SBP" : 125.5
  },
  "Patients" : {
    "I6nb3CB52ARmWtfpA5ZRpLjiNbx1" : {
      "age" : "22",
      "devID" : "123456",
      "eillness" : "Corona",
      "email" : "asdf@gmail.com",
      "fname" : "asdf",
      "lname" : "jkl"
    }
  }
}

在这里,首先在 Log 和 toast 中,以及在 texview 中,我也在一段时间内获得了实际值,一段时间后它变为 null。

【问题讨论】:

    标签: android firebase android-studio firebase-realtime-database


    【解决方案1】:

    我不确定是否要同时为它们使用相同的对象 DatabaseReference 和 Reference 更改,但为了避免错误,我为它们中的每一个创建了一个对象,如果你在 OnDataChange 中检查 ID它不存在,它将带您到 onCancelled 并在此执行相应的程序。

    您可以查看以下代码:

           patient=mFirebaseAuth.getCurrentUser();
    
           refPatients=FirebaseDatabase.getInstance().getReference("Patients");
    
           refPatients.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    // I have modified this line and checked it inside OnDataChange if it exists or not.
                   if(dataSnapshot.hasChild(Objects.requireNonNull(patient.getUid()))){
    
                    for (DataSnapshot ds : dataSnapshot.child(Objects.requireNonNull(patient.getUid())).getChildren()){
                       deviceId = String.valueOf(ds.child("devID").getValue());
                    }
                  }
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
    //You can make sure to undo correctly and read the error if no value is retrieved from Logcat
                 Log.d("ErrorRef",databaseError.getMessage();
    );
                }
            });
            refDeviceId=FirebaseDatabase.getInstance().getReference(deviceId).addValueEventListener(new ValueEventListener() {
            @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                                if (dataSnapshot.hasChild("BT")){
                                    Stringmbt = String.valueOf(dataSnapshot.child("BT").getValue());
                                    bt.setText(mbt);
    
                            }
                        }
    
                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
    
                        }
                    });
    

    【讨论】:

    • 您好,先生,@Adel B-Lahlouh,我已经更新了不完整的代码。你能检查一下吗?
    • 我已经修改了我的答案兄弟,我希望我已经解决了你的问题@jeevankotian
    【解决方案2】:

    根据您的数据库,您应该在没有循环的情况下提取这样的值:

    databaseReferences= FirebaseDatabase.getInstance().getReference(deviceId).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                //if the value is double use : (double value = dataSnapshot.child("BT").getValue(Double.class);)
    
                float value = dataSnapshot.child("BT").getValue(Float.class);
    
                mbt= String.valueOf(value);
    
                Log.d("myTag", "This is my message"+mbt);
                Toast.makeText(getApplicationContext(),"Hi"+mbt,Toast.LENGTH_SHORT).show();
                bt.setText(mbt);
    
    
        }
    
    .......
    

    【讨论】:

    • 您好,先生,@Hasan Bou Taam,我已经更新了不完整的代码。你能检查一下吗?
    【解决方案3】:

    您的 .addValueEventListener(listener) 异步工作。您现在无法退回尚未加载的内容。因此,您将首先返回您的字段,该字段为空,并且在调用完成后,您的侦听器将被调用。但是您的字段已经返回。您可以通过放置一些日志语句来看到这一点: 所以要解决这个问题,无论您是否编写自己的侦听器,例如:

    interface MyCallback{
        void onSuccess(String BT)
    }
    

    然后做:

    public void getData(MyCallback callback) {
    databaseReferences= FirebaseDatabase.getInstance().getReference(deviceId).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()){
                mbt= String.valueOf(ds.child("BT").getValue());
                Log.d("myTag", "This is my message"+mbt);
                Toast.makeText(getApplicationContext(),"Hi"+mbt,Toast.LENGTH_SHORT).show();
                bt.setText(mbt);
            }
            callback.onSuccess(String BT);
    
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
    
        }
    });
    
    
    }
    

    参考Setting Singleton property value in Firebase Listener

    【讨论】:

    • 您好,先生,@Shehan Wisumperuma,我已经更新了不完整的代码。你能检查一下吗?
    【解决方案4】:

    尝试使用 addListenerForSingleValueEvent 而不是 addValueEventListener

    【讨论】:

    • 您好,先生,@Sinan Dönmez,我已经更新了不完整的代码。你能检查一下吗?
    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2019-09-06
    • 2021-07-21
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多