我向数据库中的节点添加侦听器,如下所示:

ref = myDB.getReference("testNode/" + uID);

...


ref.addValueEventListener(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {
     for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
        Log.d("PROFILE", singleSnapshot.getKey());
     }
   }

   @Override
   public void onCancelled(DatabaseError databaseError) {}
});


这是我的数据库结构:

   "testNode" : {
     "ffggg@gmailcom" : {
       "kcd8huka0bha6md22nh1k5enj0" : 1484814690039,
       "vd4vk67n2gb7qgpol0jp8gee62" : 1484814727049
     },
     "test22@gmailcom" : {
       "8o93lpc5clhrsrst852nfm2g75" : 1484815514788,
       "a18g2u5h525nqthpqsn6askp75" : 1484814852458
     }
   }


如您在上面看到的,我有一个要测试的日志,该日志打印如下:


  01-19 08:44:57.547 17531-17531 / com.firebase.android D / PROFILE:ffggg @ gmailcom
  01-19 08:44:57.547 17531-17531 / com.firebase.android D / PROFILE:test22 @ gmailcom
  01-19 08:45:15.446 17531-17531 / com.firebase.android D / PROFILE:8o93lpc5clhrsrst852nfm2g75
  01-19 08:45:15.446 17531-17531 / com.firebase.android D / PROFILE:a18g2u5h525nqthpqsn6askp75
  01-19 08:45:15.448 17531-17531 / com.firebase.android D / PROFILE:ffggg @ gmailcom
  01-19 08:45:15.449 17531-17531 / com.firebase.android D / PROFILE:test22 @ gmailcom
  01-19 08:45:15.587 17531-17531 / com.firebase.android D / PROFILE:8o93lpc5clhrsrst852nfm2g75
  01-19 08:45:15.587 17531-17531 / com.firebase.android D / PROFILE:a18g2u5h525nqthpqsn6askp75
  01-19 08:45:15.588 17531-17531 / com.firebase.android D / PROFILE:ffggg @ gmailcom
  01-19 08:45:15.588 17531-17531 / com.firebase.android D / PROFILE:test22 @ gmailcom


现在假设uID是test22@gmailcom(并且我已经检查了字符串不为null或为空),我应该只获取test22@gmailcom的孩子。但是在这里,我将所有节点都放在ref(而不是它们的子节点,除非节点是uID)下。我不想这样做,因为如果我有成千上万的记录,那么我会下载很多不必要的数据。

我是在做错什么,还是Firebase实施了Listners?

更新1

当我从应用程序抽屉中打开应用程序时,它将获得我想要的节点的正确子节点。但是,当我转到该活动中的另一个活动时,我在另一个类中向正在侦听的节点添加了一个孩子,然后回到正在该节点上侦听的类,我得到了奇怪的输出。

这是我添加到节点的其他活动的代码:

pullNewImage = myDB.getReference("testNode");
pullNewImage.child(uID).child(randomName).setValue(ServerValue.TIMESTAMP);


更新2

我更新的侦听器代码:

 //global var

 ValueEventListener profileListener = null;

//....

profileListener = ref.child(userEmail).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
                            Log.d("PROFILE", singleSnapshot.getKey());
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {}
                });


//...
 @Override
        public void onStop() {
            super.onStop();
            if (mAuthListener != null) {
                auth.removeAuthStateListener(mAuthListener);
            }
            if(profileListener != null)
                ref.removeEventListener(profileListener);

        }

最佳答案

使用ref = myDB.getReference("testNode").child(uID);

编辑:

因为您说的是问题是当您更改活动时,所以您可能没有停止监听器。

添加一个ValueEventListener:ValueEventListener profileListener = null;
 并删除线程。然后将您的侦听器设置为ValueEventListener:

profileListener = ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
        Log.d("PROFILE", singleSnapshot.getKey());
    }
}

@Override
public void onCancelled(DatabaseError databaseError) {}
});


然后覆盖onStop()方法:

@Override
public void onStop() {
    super.onStop();

    if(profileListener != null)
        ref.removeEventListener(profileListener);
}


编辑2:

仍然不确定上述原因为何不起作用,但是您也可以尝试一下:

以下假设DatabaseReference ref = FirebaseDatabase.getInstance().getReference("testNode");

Query profileQ = ref.orderByKey().equalTo(userEmail);
profileQ.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
        Log.d("PROFILE", singleSnapshot.getKey());
    }
}

@Override
public void onCancelled(DatabaseError databaseError) {}
});


如果可行,则必须用Queue替换ValueEventListener(队列是从ValueEventListener继承的)。由于它正在处理UID,因此只会返回一个...但是如果这在其他方法无效的情况下让我感到惊讶。

10-08 17:13