2017-10-09 16 views
1

firebaseデータベースから値を取得しようとしています。firebaseデータベースから値を取得できません

onDataChange()関数に値を表示していますが、値を表示できません。

コード:

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

レスポンスは非同期です。 OnDataChange外の値を印刷しようとすると、おそらくサーバーからの応答がなく、名前配列も空で、後で@matipというonDataChangeが呼び出されます。 – matip

+0

@matip、これはわかりますが、解決策は何ですか。 –

+0

下記の私の答えを参照してください – matip

答えて

0

私はFirebaseに私のコメントコールで述べたように、非同期です。

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

} 

インタフェース:あなたはあなたの方法はRecordsオブジェクトを返すようにしたい場合は、コールバックを使用する必要があり

public interface MyCallback{ 
      void onSuccess(Records record) 
} 

をそして、あなたはこのように、このメソッドを呼び出すことができます。Firebaseから

readtraditional(mystring,new MyCallback{ 
     @Override 
     void onSuccess(Records record){ 
      //do whatever you want 
     } 
}); 
関連する問題