子值=空

时间:2018-11-15 09:03:55

标签: android firebase firebase-realtime-database

我有一个看起来像这样的数据库:

database
   |
  places
     |
     user1
     |  |___indoors: "yes"
     |  |___outdoors: "yes"
     |
     user2
        |___indoors: "yes"   
        |___outdoors: "no"

执行以下操作时,我会毫无问题地将所有用户放置信息作为单个对象(转换为String)

ValueEventListener placesListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String locations = dataSnapshot.toString(); // I get the entire tree as String
    }
}

//this is how I set the listener to changes
DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference reference = database.child("places");
reference.addValueEventListener(placesListener);

但是,当我只想要indoors个孩子时,我会得到DataSnapshot {key = indoors, value = null}

这是我尝试仅获取indoors键和值的方法(几乎相同,只添加了额外的.child("indoors")

ValueEventListener placesListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String indoors = dataSnapshot.child("indoors").toString(); // I get value = null
    }
}

// listener remains the same

1 个答案:

答案 0 :(得分:3)

DataSnapshot中包含的数据是相对的,就像JSON tree。来自DataSnapshot#child()上的文档:

  

获取指定位置的相对路径的DataSnapshot。相对路径可以是简单的子键(例如'fred'),也可以是较深的斜杠分隔路径(例如'fred / name / first')。如果子位置没有数据,则返回一个空的DataSnapshot。

在您的示例中,indoors节点正下方没有名为places的子级。相反,您有两个名为user1user2的孩子,每个孩子都有一个名为indoors的孩子。因此,为了访问indoors子级之一,您需要执行以下操作:

dataSnapshot.child("user1").child("indoors").toString();

或者,您可以iterate through the children使用:

for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
    Log.d(childSnapshot.getKey() + ": indoors=" + childSnapshot.child("indoors").toString());
}