【问题标题】:Firebase Database differentiate between online and offline dataFirebase 数据库区分在线和离线数据
【发布时间】:2017-05-24 14:32:00
【问题描述】:

我知道 Firebase 实时数据库提供离线支持,但如何区分在线连接提供的数据或本地离线更改提供的数据?

【问题讨论】:

标签: firebase firebase-realtime-database


【解决方案1】:

Firebase 数据库提供了一种特定方法来了解客户端是否已连接。

Google 就该主题写了一个方便的documentation

从提供的链接:

检测连接状态

对于许多与在线状态相关的功能,客户知道自己何时在线或离线很有用。 Firebase 实时数据库客户端在 /.info/connected 提供一个特殊位置,每次客户端的连接状态更改时都会更新该位置。

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    boolean connected = snapshot.getValue(Boolean.class);
    if (connected) {
      System.out.println("connected");
    } else {
      System.out.println("not connected");
    }
  }
  @Override
  public void onCancelled(DatabaseError error) {
    System.err.println("Listener was cancelled");
  }
});

/.info/connected 是一个布尔值,它在客户端之间不同步,因为该值取决于客户端的状态。换句话说,如果一个客户端将/.info/connected 读为假,这并不能保证另一个客户端也会读为假。

在 Android 上,Firebase 会自动管理连接状态以减少带宽和电池使用量。当客户端没有活动的侦听器、没有挂起的写入或onDisconnect 操作,并且没有通过goOffline 方法显式断开连接时,Firebase 会在 60 秒不活动后关闭连接。

了解您的客户端是否连接到数据库将有助于区分在线和离线存储提供的数据。我很确定没有特定的方法可以查看 DataSnapshot 是来自在线数据还是离线数据。

【讨论】:

  • 这不是一种可行的方法。刚刚测试了一下,通过在“onConnected”回调之后加载一个值,首先返回一个缓存的(离线)值,稍后返回新的(在线)值。
  • 如果没有活跃的听众,60 秒的断开连接是我不知道的!我正在收听 .info/connected 参考以确定我的客户端是否有 Internet/firebase 连接,如果为假则显示网络错误。在这种情况下,firebase 似乎没有将 .info/connected 上的侦听器视为活动侦听器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2016-05-31
相关资源
最近更新 更多