【问题标题】:Firebase Persistence Data Not Loading OfflineFirebase 持久性数据未离线加载
【发布时间】:2019-11-22 11:05:53
【问题描述】:

所以我在我的活动中初始化了 firebase。

    mFirebase = FirebaseDatabase.getInstance();
    mDatabaseReference = mFirebase.getReference("buses");
    mBusReference = mDatabaseReference.child(mSelectedBusModel.getRegistrationNo());
    mValueEventListener = new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
         ...
      }

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {
         Log.e("Data", "Cancelled");
         databaseError.toException().printStackTrace();
      }
    }

    mBusReference.addValueEventListener(mValueEventListener);

我有一个扩展 Application 的单例,并且在 onCreate 方法中我启用了 firebase 持久性:

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

现在我的问题是当我离线并重新打开我的活动时,数据没有被缓存,没有加载。我已阅读文档并完成了提到的所有操作,但仍然无法正常工作。

我想要做的是让我的应用能够缓存已经从 firebase 加载的数据,因此即使在应用关闭并重新打开后它也始终可用。

请注意,我的控制台中不会显示任何错误。

【问题讨论】:

  • 调用 setPersistenceEnabled(true) 意味着 Firebase 将它最近看到的任何数据存储到磁盘。在您的测试中,您的应用是否在您离线之前加载了数据?
  • 是的。我确定了。
  • 嗯....我不确定为什么在这种情况下它不会加载。您共享的代码乍一看还不错。你可能想enable debug logging 并检查输出是否有可疑之处。

标签: android firebase firebase-realtime-database


【解决方案1】:

仅使用 setPersistenceEnabled(true) 并不能解决问题。您必须更改您的侦听器,因为您将数据保存在磁盘中但您不处理它们。你必须使用这样的东西(它取自 firebase documentation 我已经将它用于我的应用程序并为我工作)。

--- 编辑---

如果您想保持数据同步,您必须使用ref.keepSynced(true);。下面的代码是我用来从引用中检索缓存数据的代码。当我离线时,孩子会正常返回值。

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("user");
ref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot snapshot, String previousChild) {
        System.out.println(snapshot.getValue());
    }

});

【讨论】:

  • 谢谢你的回复,不过我很困惑,把我的听众换成什么?我已经在使用 ValueEventListener。您在侦听器中的代码似乎只检查连接状态并保存时间戳,您能否详细解释一下它以及它与离线模式的关系以及我应该准确更改代码的哪一部分。
猜你喜欢
  • 2017-04-05
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 2020-05-31
  • 2020-12-15
  • 2021-10-27
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多