如果应用被终止,Firebase 不会同步离线缓存

Firebase does not sync offline cache if the app is killed

提问人:Crocodile 提问时间:11/30/2016 最后编辑:SamCrocodile 更新时间:1/28/2020 访问量:2493

问:

我正在设置脱机持久性

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

之前的文章中所述,但以下用例失败:

  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. 网络连接恢复后,新记录将发送到数据库。
Android 缓存 Firebase Firebase-realtime-database

评论

0赞 Sunil Parmar 11/30/2016
如果您要清除数据(缓存),则它将无法正常工作。
1赞 Crocodile 11/30/2016
我没有清除应用程序的数据(缓存),只是杀死应用程序。
0赞 Frank van Puffelen 12/1/2016
第 5 步是否正确,取决于您在第 2 步中写入数据的方式。如果它是常规的,它确实应该被保存到磁盘上。setValue()
2赞 Bob Snyder 12/1/2016
我无法使用 Firebase 版本 10.0.0 重现该问题。我执行了您列出的步骤,并在重新启动应用时观察了添加到数据库的新记录(使用 Firebase 控制台)。我还启用了调试日志记录,以便更好地了解低级别的 Firebase 操作。logcat 消息非常详细。您可能会发现该输出很有帮助。FirebaseDatabase.getInstance().setLogLevel(Logger.Level.DEBUG)
0赞 angryITguy 9/4/2018
我执行了相同的测试,并在重新启动时发现 firebase 同步数据。使用 Firebase 数据库 16.0.2

答:

4赞 Ufkoku 7/27/2017 #1

根据 firebase 文档

在应用重启期间不会保留事务

即使启用了持久性,事务也不会跨 应用程序将重新启动。因此,您不能依赖离线完成的交易 提交到您的 Firebase 实时数据库。提供最佳用户 经验时,您的应用应显示交易尚未保存 已添加到您的 Firebase 实时数据库中,或者确保您的应用 手动记住它们,并在应用重启后再次执行它们。

评论

1赞 angryITguy 9/4/2018
离线交易处理的意义何在,当应用程序重新启动时会丢失数据?这不是极端情况。谷歌再次停在所需任务的 80% 处。
0赞 Ufkoku 9/4/2018
@giulio 我完全同意你的看法。添加手动处理是相当困难的,但如果没有它,UX就会被破坏。
0赞 angryITguy 9/5/2018
自从在上面写下我的评论以来,我通过脱机更新数据库、停止应用程序(“强制停止”)、重新启动应用程序,然后重新连接,重新测试了相同的场景,并发现在版本 16 中数据正在同步。所以,我对这个用户案例是如何触发的有点困惑。
2赞 Grzegorz Adam Hankiewicz 11/11/2019
问题中显示的示例代码使用事务。因此,所引用的段落不适用。我已经测试了正常写入,即使应用程序在离线时被杀死,它们也会被存储和同步。
3赞 Prakash Shukla 10/23/2019 #2

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

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

    FireBase Database

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