Java Android Studio未从Firebase实时数据库读取检索的数据

Java Android Studio未从Firebase实时数据库读取检索的数据,java,android,firebase-realtime-database,Java,Android,Firebase Realtime Database,我试图从Firebase读取数据,但android studio无法读取,尽管我正在使用教程 我试图复制Android Studio发送到Firebase的链接: DatabaseReference myRef=database.getReference(“用户”).child(uID.child(“设备ID”); setText(myRef.toString()) 在浏览器中显示结果,然后在firebase中显示结果,但当我尝试使用它获取数据时,它不会检索任何内容。 下面是我如何通过调用函数来

我试图从Firebase读取数据,但android studio无法读取,尽管我正在使用教程

我试图复制Android Studio发送到Firebase的链接:

DatabaseReference myRef=database.getReference(“用户”).child(uID.child(“设备ID”); setText(myRef.toString())

在浏览器中显示结果,然后在firebase中显示结果,但当我尝试使用它获取数据时,它不会检索任何内容。 下面是我如何通过调用函数来读取它:

setText(ReadDeviceId)

“好的,好的”

“好的,好的” 知道我的firebase数据库安全规则是: “好的,好的”

{

“规则”:{

“.write”:“auth!=null”

“.read”:正确

}

}

“好的,好的”

但是没有显示任何内容

您可以尝试此代码

 private String ReadDeviceId(){
      FBUser = FirebaseAuth.getInstance().getCurrentUser();
      uID = FBUser.getUid();
      FirebaseDatabase database = FirebaseDatabase.getInstance();
      DatabaseReference myRef = 
           database.getReference("USERS").child(uID).child("DeviceID");

     myRef.addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
             for(Datasnapshot snapshot : dataSnapshot.getChildren)
             {
                //try to map it with your on model class and replace the String with your model class
                r_deviceID = snapshot.getValue(String.class)
             }
             //r_deviceID = dataSnapshot.getValue(String.class);
          }

          @Override
          public void onCancelled(DatabaseError error) {
        // Failed to read value
             r_deviceID = "no userID";
           }
     });
     return r_deviceID;
 }
ReadDeviceId()
函数中,您将在设置
r\u deviceID
之前返回该值(事件侦听器不同步)。因此,您的
textview.setText(ReadDeviceId())将始终是
textview.setText(null),将不显示任何内容

对于您的用例,您应该将
addValueEventListener
更改为
addListenerForSingleValueEvent
,并在处理程序本身中设置textview的值,如下所示:

private String ReadDeviceId(){
    FBUser = FirebaseAuth.getInstance().getCurrentUser();
    uID = FBUser.getUid();
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("USERS").child(uID).child("DeviceID");

    myRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                textview.setText(dataSnapshot.getValue(String.class));
        }

        @Override
        public void onCancelled(DatabaseError error) {
                // Failed to read value
                textview.setText("no userID");
        }
    });
}

你能告诉我错误吗?它不会给出错误,只是不显示任何@HussainAbbasany警告?。转到logcat并搜索此“包装器”如果你发现了,请告诉我anything@HussainAbbas当我运行它时,没有发生任何事情,应用程序工作正常,只是应该显示设备ID的文本视图是空的,没有显示。好的,你能在Firebase中显示你的数据吗?检查它,让我知道是否有任何问题。记录它并检查值。我认为它之前返回了r\u设备ID在运行getDeviceId函数之前,我试图使程序保持5秒,然后返回值。。。但我不知道是否建议将程序保持这样的状态。您是否在oncreate中调用了此函数?我尝试在运行getDeviceId函数之前使程序保持5秒钟,然后它返回值。。。但我不知道是否有人建议让这个项目像这样进行这是一个完全独立的问题。看看如何正确地延迟函数执行。
private String ReadDeviceId(){
    FBUser = FirebaseAuth.getInstance().getCurrentUser();
    uID = FBUser.getUid();
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("USERS").child(uID).child("DeviceID");

    myRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                textview.setText(dataSnapshot.getValue(String.class));
        }

        @Override
        public void onCancelled(DatabaseError error) {
                // Failed to read value
                textview.setText("no userID");
        }
    });
}