【问题标题】:how to handle offline firebase database when an android app is killed?android应用程序被杀死时如何处理离线firebase数据库?
【发布时间】:2016-10-21 18:01:00
【问题描述】:

我是第一次使用firebase,阅读了firebase的离线功能,测试了两个场景:

场景 1(工作):

  1. 离线模式,将数据写入firebase数据库。

  2. 按下后退按钮(关闭应用)

  3. 上线,数据已添加到firebase数据库。

场景 2(不工作):

  1. 离线模式,将数据写入firebase数据库
  2. 关闭应用
  3. 从后台移除应用(杀死应用)
  4. 已上线,数据未添加

我添加了这一行:

Firebase.getDefaultConfig().setPersistenceEnabled(true);

如何处理场景 2 ?我需要通过本地数据库处理这种情况吗?

【问题讨论】:

  • 当您使用 Firebase 启用持久性时,它会将本地写入操作(但不是本地事务)持久化到磁盘,以便它们能够在应用重新启动后继续存在。但在场景 2 中,数据不会被发送到服务器,直到您重新启动应用程序。如果这不能解决问题,请显示问题的最小、完整再现。代码描述比实际代码更模糊。
  • 我也遇到了同样的问题,如果你有任何解决方案,请帮忙
  • 参考您的评论@FrankvanPuffelen,这是否意味着使用setValue()updateChildren() 之类的方法设置的值在写入远程数据库之前会在本地持久化,而runTransaction() 方法却没有这样做?对吗?
  • 我在 ionic 应用中遇到了同样的情况,有什么解决方法的想法吗?
  • 我认为 Firebase 软件包中没有解决方案。也许如果你需要保存重要数据,你可以检查手机是否离线,然后将数据保存在本地,稍后在线同步回来

标签: android firebase firebase-realtime-database


【解决方案1】:

我猜你使用一些服务来同步数据,它不适用于第二种情况。为此,当用户打开数据服务时,您将收到一个广播接收器,从该检查服务未运行然后启动该服务。

【讨论】:

    【解决方案2】:

    你在使用Firebase.getDefaultConfig().setPersistenceEnabled(true);keepSynced(true)吗?

    因为在Firebase documentation 中说keepSynced(true) 是让“魔法”发生的人(与setPersistenceEnabled(true) 一起):

    通过对某个位置调用 keepSynced(true),该位置的数据将自动下载并保持同步,即使该位置没有附加监听器。此外,位置保持同步时,不会将其从永久磁盘缓存中逐出

    所以,如果你不使用它,你就不会在本地持久化你的数据库,然后当你“杀死”应用程序时,当你的应用程序再次打开时,将没有任何数据库可供查询。

    【讨论】:

      【解决方案3】:

      无需使用本地数据库处理方案 2。在应用程序类中使用 Firebase.getDefaultConfig().setPersistenceEnabled(true) 并在清单文件中设置 android:name="yourapplicationclass"。 在更改网络时处理同步,即在线/离线使用事务处理程序来处理本地同步到 firebase 数据库,因为一些 tome 数据没有推送到 firebase 服务器。像这样我使用了内部网络更改方法并解决了这个问题:

      mDatabase.runTransaction(new Transaction.Handler() {
                  @Override
                  public Transaction.Result doTransaction(MutableData mutableData) {
                      if(mutableData.getValue() == null) {
                          mutableData.setValue(1);
                      } else {
                          mutableData.setValue((Long) mutableData.getValue() + 1);
                      }
                      return Transaction.success(mutableData); //we can also abort by calling Transaction.abort()
                  }
      
                  @Override
                  public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
      
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多