2017-06-06 155 views
0

我一直试图在过去5天内从我的Firebase数据库检索数据字段,但没有取得任何成功。这是我的数据库看起来像:无法从Firebase数据库中检索数据字段

enter image description here

代码获取数据:

private void alterTextView(final String id) { 
     if(id!=null) { 
     mDatabase.child("Users").child(id).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       UserInformation userInformation = dataSnapshot.getValue(UserInformation.class); 
       String name = (String) userInformation.getName(); 


       Log.d("Main Activity",name); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
     mWelcomeUserMessage.setText("Welcome, "+name); 

    } 
}` 

我不知道为什么名字是“空”(参见日志)。 有人能告诉我我做错了什么吗?

PS:我在我的UserInformation.java类中定义了一个空白的默认构造函数,getters和setters。

另外,mDatabase被初始化为如下: mDatabase = FirebaseDatabase.getInstance().getReference();

+0

你能过去这里的.toString()你的dataSnapshot? –

+0

我不明白..我没有.toString()为我的dataSnapshot。 我认为getValue()就足够了? –

+0

它将打印一个带有键和值的json。 Log.d(TAG,“收到的数据:”+ dataSnapshot.toString()); –

回答

1

dataSnapshot.getValue(Class)只会负荷和设定值到公共字段。我看到你已经有一个默认的构造函数。

在UserInformation class public中创建名称字段。另外请确保您调用getValue的快照是UserInformation类的有效JSON表示并具有完全相同的“名称”字段(它必须完全匹配类中的名称字段)。

请注意: addValueEventListener添加了一个侦听器,当数据可用时将会调用该侦听器。

请注意,在调用onDataChange后数据可用。这就是为什么你应该从DataSnapshot获得所需数据后立即设置文本。像这样:

private void alterTextView(final String id) { 
      if(id!=null) { 
      mDatabase.child("Users").child(id).addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        UserInformation userInformation = dataSnapshot.getValue(UserInformation.class); 
        String name = (String) userInformation.getName(); 
        Log.d("Main Activity",name); 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run(){ 
          mWelcomeUserMessage.setText("Welcome, "+name); 
         } 
        }); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 

     } 
    } 
+0

我做到了。现在,当我尝试使用dataSnapshot.toString()方法显示类时,没有问题。但是,当我尝试设置我的文本视图的文本时,它仍然是空白的。我使用常规的getter方法来获取名称。 –

+0

@Yash请提供一些代码。您可能会在onDataChange方法中设置TextView的文本。你不能这样做,因为它是异步调用的。 –

+0

我在最近更新的问题中提供了代码。它仍然显示为空 –

相关问题