Почему Firebase childEventListener не работает с одной ссылкой, в то время как он работает с другой? - PullRequest
0 голосов
/ 01 сентября 2018

Ссылки:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users"); 
DatabaseReference TUidRef = usersRef.child(td);

Значение td выводится из предыдущего действия следующим образом:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        final String dataName = parent.getItemAtPosition(position).toString();
        usersdRef.orderByChild("username").equalTo(dataName).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot data: dataSnapshot.getChildren()){
                    String dataUID = data.child("uid").getValue(String.class);
                    Log.i("uid",dataUID);
                    startActivity(new Intent(Main2Activity.this, Main5Activity.class).putExtra("valueName", dataName).putExtra("valueUID",dataUID));

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });


    }
});
Bundle bundle = getIntent().getExtras();
td = bundle.getString("valueUID");

childEventListener работает с usersRef, но не с TUidRef, и он не падает или что-то в этом роде, он просто ничего не делает.

База данных выглядит примерно так: database

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Есть три случая:

  1. Когда вы загружаете /users с ValueEventListener, DataSnapshot, который вы получаете в onDataChange, содержит список пользователей. Поэтому вам нужно перебрать dataSnapshot.getChildren(), чтобы получить каждого отдельного пользователя.

  2. Когда вы запрашиваете /users, может быть несколько дочерних узлов, соответствующих условиям запроса. Таким образом, DataSnapshot, в который вы попали onDataChange, содержит список пользователей, и вам нужно их зациклить.

  3. Когда вы присоединяете ValueEventListener к /users/$uid, DataSnapshot, который вы получаете в onDataChange, содержит свойства одного пользователя. Таким образом, вам больше не нужно зацикливаться на DataSnapshot.getChildren():

Код для этого последнего случая:

TUidRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String dataUID = data.child("uid").getValue(String.class);
        Log.i("uid",dataUID);
        startActivity(new Intent(Main2Activity.this, Main5Activity.class).putExtra("valueName", dataName).putExtra("valueUID",dataUID));
    }
    ...
0 голосов
/ 01 сентября 2018

Я не думаю, что вы передаете пакет правильно, попробуйте изменить

td = bundle.getString("valueUID");

до

td = getIntent().getString("valueUID");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...