我有一个看起来像这样的数据库:
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
答案 0 :(得分:3)
DataSnapshot
中包含的数据是相对的,就像JSON tree。来自DataSnapshot#child()
上的文档:
获取指定位置的相对路径的DataSnapshot。相对路径可以是简单的子键(例如'fred'),也可以是较深的斜杠分隔路径(例如'fred / name / first')。如果子位置没有数据,则返回一个空的DataSnapshot。
在您的示例中,indoors
节点正下方没有名为places
的子级。相反,您有两个名为user1
和user2
的孩子,每个孩子都有一个名为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());
}