[英]Firebase Realtime returns null but data exists
我遇到了与Firebase Realtime数据库有关的问题,尤其是触发多次事件的value事件侦听器。似乎当Internet状态从开变为关多次并且设备最终具有稳定的连接时, onDataChange(DataSnapshot dataSnapshot)侦听器的回调方法使用null内容的dataSnapshot调用。似乎实时数据库引用了应用程序的本地缓存,在这种情况下,我没有任何数据存储在其中。 我将侦听器附加到Activity onStart()内,或者在设备建立了某些连接后; 我在Activity onStop()方法内部或在设备断开Internet连接时分离侦听器。一次仅存在一个给定侦听器的实例,并且每个附加操作都在需要时执行相应的分离操作。 我试图在连接状态更改之间等待一会儿,然后再连接侦听器,如果datasnapshot返回null则重新连接侦听器,但均无效,请提供解决方案。
Activity中的一些示例代码:
private ValueEventListener listener;
private Query query;
private boolean hasAttachedListener;
private Query getDatabaseReference() {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
return reference.child(“some child ref”)
.child(“other child ref 2 ”);
}
private ValueEventListener getDatabaseListener() {
return new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(“firebase”, dataSnapshot.toString());
//issue here datasnapshot is null sometimes
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(“firebase”, databaseError.getDetails());
}
};
}
/**
* Attaches listener
*/
public void addListener() {
if (!hasAttachedListener) {
query = getDatabaseReference();
listener = getDatabaseListener();
query.addValueEventListener(listener);
hasAttachedListener = true;
}
}
/**
* Detaches the attached listener
*/
public void removeListener() {
if (hasAttachedListener) {
query.removeEventListener(listener);
query = null;
listener = null;
hasAttachedListener = false;
}
}
@Override
protected void onStart() {
super.onStart();
addListener();
}
@Override
protected void onStop() {
super.onStop();
removeListener();
}
@Override
protected void onNetworkDisconnected() {
super.onNetworkDisconnected();
// invoked when internet connection is lost
removeListener();
}
@Override
protected void onNetworkReconnected() {
super.onNetworkReconnected();
// invoked when internet connection is restored
addListener();
}
使用Firebase离线功能,如果没有与数据库的连接,则无需使用这两种方法进行侦听
因此您的onNetworkDisconnected
和onNetworkReconnected
不需要
在此处查看Firebase文档: https : //firebase.google.com/docs/database/android/offline-capabilities
Firebase实时数据库为活动侦听器同步并存储数据的本地副本。 此外,您可以使特定位置保持同步。
DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("scores");
scoresRef.keepSynced(true);
即使引用没有活动的侦听器,Firebase Realtime Database客户端也会自动在这些位置下载数据并保持同步。 您可以使用以下代码行关闭同步。
新数据应具有唯一名称,以防止替换现有数据
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.