Firebase Realtime返回null但存在数据

时间:2018-07-10 09:20:40

标签: android firebase null real-time-updates

我遇到有关 Firebase Realtime数据库的问题,尤其是触发多次事件的value事件监听器。似乎当Internet状态多次从开到关更改时,设备最终具有稳定的连接,使用空内容的dataSnapshot调用侦听器的onstrongChange(DataSnapshot 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();
}

2 个答案:

答案 0 :(得分:0)

具有firebase脱机功能,如果没有与数据库的连接,则不需要使用这两种方法进行监听

因此您的onNetworkDisconnectedonNetworkReconnected不是必需的

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

保持数据新鲜

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

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

即使引用没有活动的侦听器,Firebase Realtime Database客户端也会自动在这些位置下载数据并保持同步。您可以使用下面的代码关闭同步。

答案 1 :(得分:0)

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