【问题标题】:Firebase does not sync offline cache if the app is killed如果应用被杀死,Firebase 不会同步离线缓存
【发布时间】:2016-11-30 05:27:31
【问题描述】:

我正在设置离线持久化

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

in an earlier post 所述,但以下用例失败:

  1. 在手机上关闭互联网连接
  2. 尝试写入数据库
  3. 使用操作系统中用户的多任务菜单从内存中杀死应用程序
  4. 重新开启互联网连接
  5. 重新启动应用程序。 此时我希望通过恢复的网络连接将步骤 2 中的新记录发送到数据库,但这不会发生。(我的预期是否正确?)

示例代码:

static{
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}

void updateValue(){
    DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("mydb");
    dbRef.keepSynced(true);
    dbRef.setValue("123");
}

请注意,如果我不从内存中终止应用程序,缓存将起作用:

  1. 在手机上关闭互联网连接
  2. 尝试写入数据库
  3. 重新开启互联网连接
  4. 一旦网络连接恢复,新记录就会发送到数据库。

【问题讨论】:

  • 如果您正在清除数据(缓存),那么它将不起作用。
  • 我没有清除应用程序的数据(缓存),只是杀死应用程序。
  • 你的第 5 步是否正确,取决于你如何在第 2 步中写入数据。如果是常规的setValue(),它确实应该已经持久化到磁盘。
  • 我无法使用 Firebase 10.0.0 版重现该问题。我执行了您列出的步骤,并观察了重新启动应用程序时添加到数据库中的新记录(使用 Firebase 控制台)。我还启用了调试日志记录,以便更好地了解低级 Firebase 操作FirebaseDatabase.getInstance().setLogLevel(Logger.Level.DEBUG)。 logcat 消息非常详细。您可能会发现该输出很有帮助。
  • 我进行了同样的测试,发现 firebase sync 是重启时的数据。使用 Firebase 数据库 16.0.2

标签: android caching firebase firebase-realtime-database


【解决方案1】:

根据火力基地documentation

事务不会在应用重启后保留

即使启用了持久性,事务也不会持久化 应用程序重新启动。所以你不能依赖离线完成的交易 致力于您的 Firebase 实时数据库。为用户提供最好的 经验,您的应用程序应该显示交易尚未保存 进入您的 Firebase 实时数据库,或者确保您的应用 手动记住它们并在应用重启后再次执行它们。

【讨论】:

  • 离线事务处理有什么意义,当应用重启时会丢失数据?这不是边缘情况。 Google 再一次在所需任务的 80% 处停止。
  • @giulio 我完全同意你的看法。添加手动处理相当困难,但没有它,用户体验就会被破坏。
  • 自从写了我上面的评论后,我通过离线更新数据库,停止应用程序(“强制停止”),重新启动应用程序,然后重新连接,重新测试了相同的场景,发现在版本 16 数据正在同步。所以,对于这个用户案例是如何触发的,我有点困惑。
  • 问题中显示的示例代码使用事务。因此,引用的段落不适用。我已经测试了正常的写入,即使应用在离线时被杀死,它们也会被存储和同步。
【解决方案2】:

像魅力一样工作,看看我做了什么。

    ---应用离线时的动作---
  • 1。添加了 4 个条目
  • 2. 应用被杀
  • 3。编辑了 1 个条目
  • 4。应用被杀
  • 5。删除一项
  • 6。应用被杀
  • 7。应用程序这次通过互联网连接启动
  • 数据完美同步。我用了 4 行火库魔法

     //Firebase Database Magic lines
        val firebaseDatabase: FirebaseDatabase = FirebaseDatabase.getInstance()
        firebaseDatabase.setPersistenceEnabled(true)
        val firebaseDatabase: FirebaseDatabase= firebaseDatabase.getReference("Prakash")
        databaseReference.keepSynced(true)
    

    【讨论】:

      猜你喜欢
      • 2019-08-19
      • 1970-01-01
      • 2016-10-21
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多