com.google.firebase.database.DatabaseException:在使用 FirebaseDatabase 实例之前,必须先调用 setPersistenceEnabled()

com.google.firebase.database.DatabaseException: Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance

提问人:Vincent Macharia 提问时间:6/11/2016 更新时间:9/28/2021 访问量:19070

问:

当我尝试在fIREBASE中设置持久性时遇到了问题,有人可以解释一下如何去做吗,

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_meal_details);

        if (mDatabase == null) {
            mDatabase = FirebaseDatabase.getInstance().getReference();
            FirebaseDatabase.getInstance().setPersistenceEnabled(true);
            // ...
        }


       // FirebaseDatabase.getInstance().setPersistenceEnabled(true);
        mDatabase = FirebaseDatabase.getInstance().getReference();
android firebase firebase-realtime-database

评论

2赞 Bob Snyder 6/11/2016
除了 Frank 的回答之外,还应该添加一个检查,例如 ,以确保在活动重新启动时不会再次执行该语句。否则,您将在旋转设备时出现异常。savedInstanceState == null

答:

23赞 Frank van Puffelen 6/11/2016 #1

像这样的东西(iirc):

 if (mDatabase == null) {
     FirebaseDatabase database = FirebaseDatabase.getInstance();
     database.setPersistenceEnabled(true);
     mDatabase = database.getReference();
     // ...
 }

评论

5赞 drod 5/11/2017
Firebase 团队是否有针对此问题的最佳实践 Frank?我看到你对这个问题提供了 2 或 3 种不同的答案。您能给我们指出一个最佳实践吗?
106赞 Siddhesh Dighe 6/12/2016 #2

根据 Firebase 文档,setPersistenceEnabled 只能调用一次(在创建任何其他 FirebaseDatabase 实例之前)

因此,对我来说,这个问题的解决方案如下

  1. 您需要创建一个类,该将 android.app.ApplicationsetPersistenceEnabled(true) 扩展到那里。

例如

class MyFirebaseApp extends android.app.Application 

@Override
public void onCreate() {
    super.onCreate();
    /* Enable disk persistence  */
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
  1. 清单中,将 MyFirebaseApp 类链接到应用程序标记

例如

在应用程序标记中,添加以下内容

android:name="com.example.MyFirebaseApp"

这应该可以正常工作。

此外,不要在任何其他活动中使用 setPersistenceEnabled。

评论

0赞 Nicolás Arias 9/24/2016
我尝试了这个,并反复出现以下异常 致命异常:main Process:co.transportsystems.offrie:background_crash,PID:27025 java.lang.RuntimeException:无法创建应用程序 com.android.tools.fd.runtime.BootstrapApplication:java.lang.IllegalStateException:名称为 [DEFAULT] 的 FirebaseApp 不存在。知道为什么会发生这种情况吗?
1赞 Arpit Patel 10/7/2016
这对我有用......Thanx siddhesh..+1 从我这边。
3赞 Albert 2/15/2017
除此之外,如果您已经在应用程序标签上使用另一个 Application 类并且无法更改它(例如使用 MultiDexApplication 使用超过 64K 的方法配置应用程序,就像我所做的那样),您可以让 MyFirebaseApp 扩展该类。android:name
1赞 Nathan O'Kane 11/28/2017
这对我有用,似乎是要走的路。谢谢!
5赞 zarsky 8/5/2017 #3

只需在活动类的顶部添加以下内容:

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

对我有用,但不确定这是否是最佳实践。

评论

0赞 zarsky 8/7/2017
由于某种原因,使用它再次崩溃,因此使用风险自负。
3赞 Kartik Watwani #4

如果你在你的应用中扩展了 a,你可以调用你的 方法,因为这个方法甚至在启动器活动的方法之前被调用。当您在应用中使用创建活动的合成堆栈以跳过某些活动并继续前进时,这也很有用,就像在应用通知中使用时一样。因此,当您回到向后移动的启动器活动时,您可能已经在应用程序中的某个地方使用了实例,并且在这种情况下您收到的错误也可能弹出。ContentProviderFirebaseDatabase.getInstance().setPersistenceEnabled(true);ContentProvideronCreate()onCreate()TaskStackBuilderFirebaseDatabase

6赞 Vishal G. Gohel 10/18/2017 #5

这个解决方案对我有用,没有扩展 android.app.Application

private static FirebaseDatabase firebaseDatabase;

    if (firebaseDatabase == null) {
        firebaseDatabase=FirebaseDatabase.getInstance();
        firebaseDatabase.setPersistenceEnabled(true);
    }
    /* Do your other stuff  */

if (savedInstanceState == null) {
   FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
15赞 RileyManda 4/12/2018 #6

创建一个将在整个应用程序中使用的应用程序类,并在其中初始化 firebase Persistence: 该类应扩展 Application。( ClassName 扩展应用程序):

下面是一个例子:

FirebaseHandler 类

您可以调用/命名任何您想要命名的类

public class FirebaseHandler extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);   
    }
}

将应用程序类添加到清单中:

 <application
    android:name=".FirebaseHandler"
    android:allowBackup="true"
    android:icon="@mipmap/app_icon"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">

这样,数据持久性将应用于整个项目。 为了将磁盘持久性应用于特定数据。

DatabaseReference myRef=FirebaseDatabase.getInstance().getReference("people"); 
myRef.keepSynced(true);

这将使您的离线数据保持同步和最新

myRef.keepSynced(true);

在此处了解有关磁盘持久性的更多信息

0赞 Isaac Sekamatte 1/2/2019 #7

在调用之前,您可以尝试检查是否有任何已初始化的 firebase 应用setPersistenceEnabled.

if (FirebaseApp.getApps(this).size() == 0)
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);

评论

0赞 Lakpriya Senevirathna 6/28/2021
是否有其他使用 firebase 的应用?可以使用吗?
0赞 Isaac Sekamatte 6/29/2021
最好是初始化任何应用程序
1赞 MetaPlanet 3/22/2019 #8

如果您使用的是 Kotlin,以下代码对我有用。我在类的顶部声明为私有成员变量。

private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }
1赞 Lakpriya Senevirathna 6/28/2021 #9

这对我有用。将其添加到您的启动活动中!

try {           
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
} catch (Exception e) {}