为什么Firebase childEventListener不能与一个引用一起使用?

时间:2018-09-01 10:59:24

标签: android firebase firebase-realtime-database event-listener

参考文献是:

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 :(得分:1)

有三种情况:

  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));
    }
    ...

答案 1 :(得分:0)

我认为您没有正确通过捆绑软件尝试更改

td = bundle.getString("valueUID");

td = getIntent().getString("valueUID");