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



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

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@gmailcom01-19 08:44:57.547 17531-17531/com.firebase.android D/简介:test22@gmailcom01-19 08:45:15.446 17531-17531/com.firebase.android D/简介:8o93lpc5clhrsrst852nfm2g7501-19 08:45:15.446 17531-17531/com.firebase.android D/简介:a18g2u5h525nqthpqsn6askp7501-19 08:45:15.448 17531-17531/com.firebase.android D/简介:ffggg@gmailcom01-19 08:45:15.449 17531-17531/com.firebase.android D/简介:test22@gmailcom01-19 08:45:15.587 17531-17531/com.firebase.android D/简介:8o93lpc5clhrsrst852nfm2g7501-19 08:45:15.587 17531-17531/com.firebase.android D/简介:a18g2u5h525nqthpqsn6askp7501-19 08:45:15.588 17531-17531/com.firebase.android D/简介:ffggg@gmailcom01-19 08:45:15.588 17531-17531/com.firebase.android D/简介:test22@gmailcom

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

是我做错了什么,还是Listners是由firebase这样实现的?

更新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) {}
});

如果这样做有效,则必须将ValueEventListener替换为Queue(Queue是从ValueEventListen器继承的)。由于它处理的是UID,所以它只会返回一个。。。但是,如果这种方法有效,而其他方法无效,我会感到惊讶。

要一次性检索数据,请使用以下命令:

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

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

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

ref = mDB.getReference("testnode");

如果您想继续侦听ONLY节点,则使用"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);

Firebase离线功能

我得到了错误的聊天计数值(即它总是给我聊天的总计数,而不是未读消息的计数)
我刚刚完成了FirebaseDatabase.getInstance().setPersistenceEnabled(false);我的问题解决了

相关内容

最新更新