【问题标题】:Firebase Realtime returns null but data existsFirebase Realtime 返回 null 但数据存在
【发布时间】:2018-12-18 01:59:09
【问题描述】:

我遇到了一个关于 Firebase 实时数据库 的问题,特别是多次触发的值事件侦听器。似乎当互联网状态从打开到关闭多次并且设备终于有稳定的连接监听器的onDataChange(DataSnapshot dataSnapshot)回调方法被空内容的dataSnapshot调用。似乎实时数据库是指应用程序的本地缓存和在那种情况下,我没有存储任何数据。我在 Activity onStart() 内或设备已建立某些连接时附加侦听器;我在 Activity onStop() 方法内或设备断开互联网连接时分离侦听器。一次仅存在一个给定侦听器的实例,并且每个附加都在需要时执行相应的分离操作。我试图在连接监听器之前等待连接状态的变化,如果数据快照返回 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 服务的工作应用程序!问题在于事件侦听器缓存信息不正确。我已联系 Firebase 支持以重新处理此问题,他们已确认我正确使用了实时更新功能,但他们无能为力。
  • 请添加您正在使用的代码。
  • @AlexMamo 代码添加
  • 您是否尝试删除 onNetworkDisconnectedonNetworkReconnected,因为不需要这些方法。

标签: android firebase null real-time-updates


【解决方案1】:

新数据应该有唯一的名称,以防止替换已存在的数据

【讨论】:

    【解决方案2】:

    使用 firebase 离线功能,如果没有与数据库的连接,则无需使用这两种方法进行侦听

    所以你的onNetworkDisconnectedonNetworkReconnected 不是必需的

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

    保持数据新鲜

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 2019-07-07
      • 2018-09-14
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2020-03-25
      相关资源
      最近更新 更多