Дочернее значение = ноль - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть база данных, которая выглядит следующим образом:

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

Когда я делаю следующее, я получаю информацию о местах всех пользователей как один объект (преобразованный в строку) без проблем:

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 голосов
/ 15 ноября 2018

Данные, содержащиеся в DataSnapshot, являются относительными, как дерево JSON . Из документации на DataSnapshot#child():

Получить DataSnapshot для местоположения по указанному относительному пути. Относительный путь может быть либо простым дочерним ключом (например, «fred»), либо более глубоким разделенным слешем путем (например, «fred / name / first»). Если у дочернего местоположения нет данных, возвращается пустой DataSnapshot.

В вашем примере нет дочернего элемента с именем indoors непосредственно под узлом places. Вместо этого у вас есть 2 ребенка с именами user1 и user2, у каждого из которых есть ребенок с именем indoors. Поэтому, чтобы получить доступ к одному из indoors потомков, вам нужно сделать что-то вроде:

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

В качестве альтернативы, вы можете перебирать дочерние элементы , используя:

for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
    Log.d(childSnapshot.getKey() + ": indoors=" + childSnapshot.child("indoors").toString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...