Java 从Firebase加载数据第一次仅返回null

Java 从Firebase加载数据第一次仅返回null,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在将两个值写入firebase数据库,如下所示 String key = mClientDatabaseReference.push().getKey(); // get user input and set it to result // edit text Client client = new Client( firstNameEditText.getText()

我正在将两个值写入firebase数据库,如下所示

    String key = mClientDatabaseReference.push().getKey();

                   // get user input and set it to result
                   // edit text
                   Client client = new Client( firstNameEditText.getText().toString(), lastNameEditText.getText().toString() );
                   mClientDatabaseReference.child( key ).child( "firstName" ).setValue( firstNameEditText.getText().toString() );
                   mClientDatabaseReference.child( key ).child( "lastName" ).setValue( lastNameEditText.getText().toString() );
除了发生在ChildEventListener身上的一件烦人的小事之外,一切都很顺利。当调用onChildAdded时,它在设置第一个名称的值之后被调用,并且它不会等到第二个名称值被sat,因此我只得到第二个名称为null的第一个名称,并且我必须重新打开活动以获得完整的firs和last name。 这是OnChildaded中的代码

 public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Client client = dataSnapshot.getValue( Client.class );
            mClientAdapter.add( client );           
            Log.d(TAG+"Added",dataSnapshot.getValue(Client.class).toString());
        }

如何解决此问题?

您可以使用addvalueeventlistener:

 DatabaseReference reference = FirebaseDatabase.getInstance().getReference("users");

reference.addValueEventListener(new ValueEventListener() {
   @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for(DataSnapshot datas: dataSnapshot.getChildren()){
   String name=datas.child("firstName").getValue().toString();
   String lname=datas.child("lastName").getValue().toString();
  }
}
    @Override 
public void onCancelled(DatabaseError databaseError) {
    }
 });
由于您只想检索数据,如果您想读取一次,请使用addvalueeventlistener或addListenerForSingleValueEvent。假设您拥有以下数据库:

users
 userid
    firstName:firstname
    lastName: lastname

但是我如何才能做到这一点呢?它是一个在监听器内部的监听器,并且每次添加值时都会进行更新……是否可以以某种方式将这些值添加到一行中?能否将代码
onchildaded
?答案让我想到了将值监听器放在on-child-added中,并捕获其值被setValue()呈现为null的子对象更新它。它起作用了。我不明白为什么。还没有,我正在尝试一些东西,如果它不起作用,我会试试这个…不过再次谢谢