Android Firebase数据库侦听器检索错误信息

Android Firebase数据库侦听器检索错误信息,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我正在向数据库中的节点添加侦听器,如下所示: ref = myDB.getReference("testNode/" + uID); ... ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot singleSnapshot : dataSnapshot.

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

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
     }
   }
如上所示,我有一个测试日志,日志打印如下:

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) {}
});
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
(我已经检查了字符串是否为空)我应该只得到
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”)


如果这样做有效,则必须将ValueEventListener替换为队列(队列继承自ValueEventListener)。因为它处理的是UID,所以它只返回一个。。。但是,如果其他方法不起作用,而这种方法起作用,我会感到惊讶。

要一次性检索数据,请使用以下方法:

ref.addListenerForSingleValueEvent(
                    new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
    }});

尝试如下更改引用和侦听器:

ref = myDB.getReference().child("testnode");

如果只想继续侦听节点,而不是使用“addValueEventListener”,否则请使用“addListenerForSingleValueEvent”

并更改附加侦听器以引用子节点的代码

ref.child(uid).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) {}
            });

firebase中的数据不同步,如果启用了持久模式,请在代码中禁用它


FirebaseDatabase.getInstance().setPersistenceEnabled(false)我得到了错误的聊天计数值(即,它总是给我聊天的总计数,而不是未读邮件计数)
我刚刚完成了
FirebaseDatabase.getInstance().setPersistenceEnabled(false)

我的问题解决了

我已经试过了,只是再试一次确定一下。它不起作用。当我启动应用程序时,正确节点下的子节点将被打印出来,而我只需要打印。当我从另一个活动添加到节点时,我得到了上面块引号中提到的奇怪输出。为什么在线程中有侦听器?侦听器以异步方式运行。。除非你有其他原因,否则我会删除它。另外,你想继续监听更改,还是只想获取一次数据?啊,是的,我忘了它是异步运行的。我把它移走了,什么也没变。同样的错误。另外,我想继续收听尝试我上面添加的内容,一旦你离开活动,它将停止收听,这是清理活动的良好实践。另外,如果您希望只获取一次信息,您可以将当前的addValueEventListener更改为addSingleValueEventListener。保持侦听非常重要,因此这不是一个选项
ref.child(uid).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) {}
            });