2017-06-06 2 views
0

Ich habe versucht, Datenfelder aus meiner Firebase-Datenbank für die letzten 5 Tage ohne Erfolg abzurufen. Dies ist, was meine Datenbank wie folgt aussieht:Nicht in der Lage, Datenfeld aus der Firebase-Datenbank abzurufen

enter image description here

-Code zum Abrufen von Daten:

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

    } 
}` 

Ich habe keine Ahnung, warum der Name 'null' (siehe Protokoll) ist. Kann mir jemand sagen, was ich falsch mache?

PS: Ich habe einen leeren Standardkonstruktor, Getter und Setter in meiner UserInformation.java Klasse definiert.

Auch wird mDatabase wie folgt initialisiert: mDatabase = FirebaseDatabase.getInstance().getReference();

+0

können Sie hier die .toString() Ihrer dataSnapshot? –

+0

ich verstehe nicht .. Ich habe keine .toString() für meine DataSnapshot. Ich dachte, getValue() wäre ausreichend? –

+0

Es wird ein JSON mit Schlüssel und Wert drucken. Log.d (TAG, "Daten erhalten:" + dataSnapshot.toString()); –

Antwort

1

dataSnapshot.getValue(Class) wird nur Last und die eingestellten Werte in den öffentlichen Bereichen. Ich sehe, Sie haben bereits einen Standardkonstruktor.

Machen Sie das Namensfeld in der UserInformation-Klasse public. Stellen Sie außerdem sicher, dass der Snapshot, den Sie aufrufen, getValue on, eine gültige JSON-Repräsentation der UserInformation-Klasse ist und ein genaues "name" -Feld hat (es muss genau mit dem Namensfeld in der Klasse übereinstimmen).

Hinweis: addValueEventListener fügt einen Listener hinzu, der aufgerufen wird, wenn Daten verfügbar sind.

Bitte beachten Sie, dass die Daten verfügbar sind, nachdem onDataChange aufgerufen wurde. Deshalb sollten Sie Ihren Text richtig einstellen, nachdem Sie die benötigten Daten von DataSnapshot erhalten haben. So:

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

ich tat dies. Wenn ich jetzt versuche, die Klasse mit der Methode dataSnapshot.toString() anzuzeigen, gibt es kein Problem. Aber wenn ich versuche, den Text meiner Textansicht einzustellen, ist es immer noch leer. Ich verwende eine reguläre Getter-Methode, um den Namen zu erhalten. –

+0

@Yash bitte etwas Code zur Verfügung stellen. Möglicherweise setzen Sie den TextView-Text in der onDataChange-Methode. Sie können das nicht tun, weil es asynchron aufgerufen wird. –

+0

Ich habe den Code in meinem letzten Update der Frage zur Verfügung gestellt. Es zeigt immer noch Null –