dataSnapshot.getChildren()获取userID但不获取值

时间:2018-03-30 21:16:30

标签: java android firebase firebase-realtime-database

运行此代码时:

private void getData(DataSnapshot dataSnapshot) {
    for(DataSnapshot ds : dataSnapshot.getChildren()){
        Log.d(TAG, "UserID inside getData: "+userID);
        Log.d(TAG, "User Name inside getData: "+ds.child(userID).child("name").getValue());
        Log.d(TAG, "DS inside getData: "+ds.child(userID));

        hospitalCity = String.valueOf(ds.child(userID).child("city").getValue());
        Log.d(TAG, "User city inside getData: "+ds.child(userID).child("city").getValue());

        break;
    }
}

日志显示:

  

getData中的UserID:Lsncj8CIsfTQXc7E425AtLuDI5v2
  getData中的用户名:null   DS里面的getData:DataSnapshot {key = Lsncj8CIsfTQXc7E425AtLuDI5v2,value = null}

     

D / DonorList:getData中的用户城市:null

这是数据库:

title]

正如您所看到的,它会获取密钥,但值为null,尽管数据库显示其中包含值。

2 个答案:

答案 0 :(得分:2)

为了获取Hospital节点下的数据,您需要更改以下参考:

hospitalDatabase = FirebaseDatabase.getInstance().getReference();

hospitalDatabase = FirebaseDatabase.getInstance().getReference().child("Hospital");

要在getData()方法中获取数据,请使用以下代码:

private void getData(DataSnapshot dataSnapshot) {
    for(DataSnapshot ds : dataSnapshot.getChildren()) {
        String key = ds.getKey();
        String city = ds.child("city").getValue(String.class);
        String name = ds.child("name").getValue(String.class);
    }
}

ds.getKey()将返回userId

ds.child("city").getValue(String.class)将返回城市。

ds.child("name").getValue(String.class)将返回名称。

答案 1 :(得分:1)

尝试:

private void getData(DataSnapshot dataSnapshot) {
    for(DataSnapshot ds : dataSnapshot.getChildren()){
        Log.d(TAG, "UserID inside getData: "+userID);
        Log.d(TAG, "User Name inside getData: "+ds.child("name").getValue());
        Log.d(TAG, "DS inside getData: "+ds.child(userID));

        hospitalCity = String.valueOf(ds.child("city").getValue());
        Log.d(TAG, "User city inside getData: "+ds.child("city").getValue());

        break;
    }
}

ds.getKey()这应该返回userID

使用.getChildren(),您正在做的事情更深入一层 如果您只查找一个值,则无需getChildren(),只需将ValueEventListener()设置为例如:

    hospitalDatabase.child(userID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                   hospitalCity = String.valueOf(dataSnapshot.child("city").getValue());

        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w(TAG, "Failed to read value.", error.toException());
        }
    });

我认为由于那里有break,你只关注一个值。