2017-10-09 202 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可能是你还没有得到服务器的响应和你的名字阵列仍然是空的,onDataChange被称为后 – matip

+0

@matip打印值,我知道这一点,但如何解决。 –

+0

看到我的回答如下 – matip

回答

0

正如我在我的评论呼叫提到火力地堡是异步的。如果你希望你的方法返回Records对象中要使用的回调:

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

} 

接口:

public interface MyCallback{ 
      void onSuccess(Records record) 
} 

你可以调用这个方法是这样的:

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