Firebase 实时返回空值,但数据存在



我遇到了有关Firebase实时数据库的问题,尤其是多次触发的值事件侦听器。似乎当互联网状态从打开变为关闭几次并且设备最终具有稳定连接时,侦听器的onDataChange(DataSnapshotdataSnapshot)回调方法将使用空内容的dataSnapshot调用。似乎实时数据库是指应用程序的本地缓存,在这种情况下,我没有在其中存储任何数据。我将侦听器附加到活动onStart()中或当设备建立某种连接时;我正在 Activity onStop() 方法中分离侦听器,或者在设备失去互联网连接时分离侦听器。一次只存在给定侦听器的一个实例,并且每个附加都在需要时执行相应的分离操作。我试图在连接状态更改之间等待一段时间,然后再附加侦听器,并在数据快照返回 null 时重新连接侦听器。这些都不起作用。请提供解决方案建议。

活动内的一些示例代码:

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 离线功能,如果没有连接到数据库,则无需使用这两种方法来侦听

所以你的onNetworkDisconnectedonNetworkReconnected不是必需

的在此处查看 Firebase 文档 : https://firebase.google.com/docs/database/android/offline-capabilities

保持数据最新

Firebase 实时数据库会同步并存储活动的侦听器的本地数据副本。此外,您可以使特定位置保持同步。

DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("scores");
scoresRef.keepSynced(true);

Firebase 实时数据库客户端会自动下载这些位置的数据,并使其保持同步,即使引用没有活动的侦听器也是如此。可以使用以下代码行重新关闭同步。

新数据应具有唯一名称,以防止替换现有数据

相关内容

  • 没有找到相关文章

最新更新