Android 中的 Firebase 数据库持久性错误

Posted

技术标签:

【中文标题】Android 中的 Firebase 数据库持久性错误【英文标题】:Firebase Database Persistence Bug in Android 【发布时间】:2016-10-19 23:47:09 【问题描述】:

在过去 2 周里,我一直在彻底使用和测试我的 android 应用。

我在我的应用中详尽地使用 Firebase 实时数据库,最重要的是,我的应用需要无缝离线工作

我有一个启动屏幕,我在启动和继续时同步特定用户节点的所有数据。

我肯定使用keepSynced(true);setPersistenceEnabled(true);

注意到一个严重的问题,这导致了很多问题。

场景 1

我是第一次使用互联网连接运行该应用,该应用运行良好。

场景 2

第一次在没有互联网连接的情况下运行该应用程序,没有任何效果。没有回调被触发。

场景 3

我在有/没有互联网连接的情况下连续运行该应用程序,它工作正常。

场景 4

但是,当我在 没有互联网连接 1 或 2 天后运行该应用程序时,没有任何效果。不会触发回调。

我似乎磁盘持久性被自动清除,这就是为什么数据无法离线使用并且没有触发回调的原因。

那么,如何控制何时清除磁盘持久性?有没有办法确保持久性永远不会被清除?有没有办法配置磁盘持久化的大小?

编辑

这就是我在应用程序类的onCreate() 中所做的。

private void initializeFirebaseDatabase() 
        if (!FirebaseApp.getApps(this).isEmpty()) 
            FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
            firebaseDatabase.setPersistenceEnabled(true);
        

【问题讨论】:

嗨 Artitra,你能解决你的问题吗?我在“com.google.firebase:firebase-database:9.2.0”中看到了类似的问题。由于很难重现这些问题,我不确定更新到最新版本是否可以解决它... 此后我无法重现该问题。 【参考方案1】:

查看此链接com.google.firebase.database.DatabaseException: Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance 我想这个问题与链接中的问题相似并且已解决。

【讨论】:

在创建任何其他实例之前,我正在我的应用程序类中执行此操作。所以这个答案根本没有帮助。 你有一个单独的类来扩展 android.app.Application,带有 FirebaseDatabase.getInstance().setPersistenceEnabled(true);在它的 onCreate 中?如果是,您是否使用 android:name="com.example.MyFirebaseApp" 将该类链接到您的应用程序? 当然可以。而且 Firebase 也不允许在任何数据库初始化后调用 setPersistence() 方法。它会引发异常。 您可以添加屏幕截图或您如何实现 setPersistence() 的代码吗?它可能有助于解决问题 您是否在所有使用 Firebase 引用的 Activity 中调用 initializeFirebaseDatabase 方法?【参考方案2】:

我遇到了同样的问题,在那里设置了启动画面 setPersistenceEnabled(true),但是当我调用 finish() 并尝试再次打开应用程序时出现错误。 解决了它杀死应用程序而不是调用finish()

我使用OnBackPressed() 来完成活动并使用Boolean isFinishing 标志来区分将应用程序发送到后台和终止它。

最后我在OnDestroy() 中杀死它:

android.os.Process.killProcess(android.os.Process.myPid());

【讨论】:

以上是关于Android 中的 Firebase 数据库持久性错误的主要内容,如果未能解决你的问题,请参考以下文章

Android - 持久化从 Firebase 检索到的数据

如何在 Android 上的 Firebase 存储中设置持久性?

Swift 3 中的 Firebase 存储图像持久性

片段中的Firebase数据不是持久的,会重新下载

1 小时后身份验证令牌无效 - Firebase 中的磁盘持久性

注销后清除 Firebase 持久性