【问题标题】:Why does the Firebase childEventListener not work with one reference while it works with the other?为什么 Firebase childEventListener 不能与一个引用一起工作,而它与另一个引用一起工作?
【发布时间】:2019-01-02 06:53:46
【问题描述】:

参考文献是:

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 一起使用,它不会崩溃或任何事情,只是什么都不做。

数据库如下所示:

【问题讨论】:

  • 你应该将值传递给其他活动,然后接收它intent.putExtra("valueUID",dataUID);
  • @PeterHaddad 我已经使用putExtra() 传递了值,并显示了接收值的代码,但侦听器无法正常工作。我不知道为什么。
  • 我昨天回答了一个非常类似的问题。见stackoverflow.com/questions/52116824/…。如果该问题来自您,但我的回答不清楚,请评论该问题。如果这个问题不是你提出的,那肯定是重复的。
  • @PradyumanDixit 哦没看到,我的错
  • @FrankvanPuffelen 我不知道这个问题,但你能告诉我childEventListener 不起作用的原因吗?

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


【解决方案1】:

分三种情况:

  1. 当您使用ValueEventListener 加载/users 时,您在onDataChange 中获得的DataSnapshot 包含用户列表。所以你需要遍历dataSnapshot.getChildren() 来获取每个单独的用户。

  2. 查询/users时,可能有多个子节点符合查询条件。所以你在onDataChange 中得到的DataSnapshot 也包含一个用户列表,你需要遍历它们。

  3. 当您将ValueEventListener 附加到/users/$uid 时,您在onDataChange 中获得的DataSnapshot 包含单个用户的属性。所以你不再需要循环遍历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));
    }
    ...

【讨论】:

    【解决方案2】:

    我认为您没有正确传递捆绑包尝试更改

    td = bundle.getString("valueUID");
    

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

    【讨论】:

    • 我记录了值,和预期的一样。传值没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2012-06-13
    • 2010-10-28
    • 2021-04-29
    • 2015-03-16
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多