2017-10-09 5 views
1

Ich versuche, Werte aus meiner Firebase-Datenbank abrufen.Kann den Wert von Firebase-Datenbank nicht abrufen

Es zeigt die Werte in der Funktion onDataChange() an, kann aber die Werte nicht anzeigen.

Code:

public Records readtraditional(String email) 
{ 
    final Records record = new Records(); 
    final String[] name = new String[1]; 

    myRef.child(email).child("name").addValueEventListener(new 
    ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      name[0] = dataSnapshot.getValue().toString() ; 
     //Printing value of name here 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 

    Log.i("name in ","H"+name[0]); 
    //Unable to print value of name here 
    record.setName(name[0]); 
    return record; 
} 
+1

Antwort von Firebase ist asynchron . Wenn Sie versuchen, Werte außerhalb von OnDataChange zu drucken, haben Sie wahrscheinlich keine Antwort vom Server und Ihr Namensfeld ist noch leer und onDataChange wird später aufgerufen. – matip

+0

@matip, ich weiß das, aber was ist die Lösung. –

+0

siehe meine Antwort unten – matip

Antwort

0

Wie ich in meinem Kommentar Aufruf Firebase erwähnt ist asynchron. Wenn Sie Ihre Methode Records Objekt zurückgeben möchten, sollten Sie Rückruf verwenden:

public void readtraditional(String email, MyCallback callback) 
{ 
    final Records record = new Records(); 
    final String[] name = new String[1]; 

    myRef.child(email).child("name").addValueEventListener(new 
    ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      name[0] = dataSnapshot.getValue().toString() ;     
      record.setName(name[0]); 
      callback.onSuccess(record) 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 

} 

Schnittstelle:

public interface MyCallback{ 
      void onSuccess(Records record) 
} 

Und Sie können diese Methode wie folgt aufrufen:

readtraditional(mystring,new MyCallback{ 
     @Override 
     void onSuccess(Records record){ 
      //do whatever you want 
     } 
}); 
Verwandte Themen