提问人:Crocodile 提问时间:11/30/2016 最后编辑:SamCrocodile 更新时间:1/28/2020 访问量:2493
如果应用被终止,Firebase 不会同步离线缓存
Firebase does not sync offline cache if the app is killed
问:
我正在设置脱机持久性
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
如之前的文章中所述,但以下用例失败:
- 关闭听筒上的互联网连接
- 尝试写入数据库
- 使用操作系统中的用户多任务菜单从内存中杀死应用程序
- 重新打开互联网连接
- 重新启动应用程序。 此时,我希望通过还原的网络连接将步骤 2 中的新记录发送到数据库,但这不会发生。 (我的期望正确吗?
示例代码:
static{
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
void updateValue(){
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("mydb");
dbRef.keepSynced(true);
dbRef.setValue("123");
}
请注意,如果我不从内存中杀死应用程序,缓存将起作用:
- 关闭听筒上的互联网连接
- 尝试写入数据库
- 重新打开互联网连接
- 网络连接恢复后,新记录将发送到数据库。
答:
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
像魅力一样工作,看看我做了什么。
- ---应用脱机时的操作---
数据完美同步。我用了 4 行火库魔法
//Firebase Database Magic lines
val firebaseDatabase: FirebaseDatabase = FirebaseDatabase.getInstance()
firebaseDatabase.setPersistenceEnabled(true)
val firebaseDatabase: FirebaseDatabase= firebaseDatabase.getReference("Prakash")
databaseReference.keepSynced(true)
评论
setValue()
FirebaseDatabase.getInstance().setLogLevel(Logger.Level.DEBUG)