【问题标题】:Android Studio is not reading the retreived data from Firebase realtime databaseAndroid Studio 未从 Firebase 实时数据库中读取检索到的数据
【发布时间】:2019-08-29 13:49:45
【问题描述】:

我正在尝试从 Firebase 读取数据,但尽管我正在使用教程,但 android studio 并未读取它

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

DatabaseReference myRef = database.getReference("USERS").child(uID).child("DeviceID"); textview.setText(myRef.toString());

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

textview.setText(ReadDeviceId);

''''''''''''''''''''''''''''''''''

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

            r_deviceID = dataSnapshot.getValue(String.class);
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            r_deviceID = "no userID";
        }
    });
    return r_deviceID;
}

''''''''''''''''''''''''''''''''''''''' 知道我的 firebase 数据库安全规则是: ''''''''''''''''''''''''''''''''

{

“规则”:{

".write": "auth != null",

".read": 真

}

}

''''''''''''''''''

但什么都没有显示

【问题讨论】:

  • 你能告诉我错误吗?
  • 它没有给出错误它只是不显示任何东西@HussainAbbas
  • 任何警告?转到你的 logcat 并搜索这个“包装器”,如果你找到任何东西,请告诉我
  • @HussainAbbas 当我运行它时没有任何反应,应用程序工作正常只是应该显示 DeviceID 的文本视图为空且未显示
  • 好的,你能告诉我你在 Firebase 中的数据吗

标签: java android firebase-realtime-database


【解决方案1】:

你可以试试这个代码

 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;
 }

【讨论】:

  • 检查一下,如果有任何问题,请告诉我
  • 记录并检查值
  • 我认为它在获取数据之前会返回 r_deviceID
  • 我尝试让程序在运行 getDeviceId 函数之前保持 5 秒并返回值...但我不知道是否建议让程序保持这样
  • 你在oncreate中调用了这个函数吗?
【解决方案2】:

在您的ReadDeviceId() 函数中,您将在设置之前返回r_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");
        }
    });
}

【讨论】:

  • 我尝试让程序在运行 getDeviceId 函数之前保持 5 秒并返回值...但我不知道是否建议让程序保持这样
  • 这完全是一个单独的问题。查看this answer 了解如何正确延迟函数执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2019-05-30
  • 1970-01-01
相关资源
最近更新 更多