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

Android com.google.firebase.database.DatabaseException:在其他任何使用FirebaseDatabase实例之前,必须先调用setPersistenceEnabled(),android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,当我试图在fIREBASE中设置Persistence时,我遇到了一个问题,请有人解释一下如何设置Persistence protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_meal_details); if (mDatabase == null) {

当我试图在fIREBASE中设置Persistence时,我遇到了一个问题,请有人解释一下如何设置Persistence

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();
类似这样的内容(iirc):


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

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

  • 您需要创建一个来扩展android.app.Application设置PersistenceEnabled(true)
  • 比如说

    class MyFirebaseApp extends android.app.Application 
    
    @Override
    public void onCreate() {
        super.onCreate();
        /* Enable disk persistence  */
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    }
    
  • 在清单中,将MyFirebaseApp类链接到应用程序标记
  • 比如说

    class MyFirebaseApp extends android.app.Application 
    
    @Override
    public void onCreate() {
        super.onCreate();
        /* Enable disk persistence  */
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    }
    
    在应用程序标记中添加以下内容

    android:name="com.example.MyFirebaseApp"
    
    这应该行得通


    也不要在任何其他活动中使用setPersistenceEnabled。

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

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

    为我工作,但不确定这是否是最佳实践。

    如果在应用程序中扩展
    内容提供者
    ,则可以调用
    FirebaseDatabase.getInstance().setPersistenceEnabled(true)
    
    ContentProvider
    onCreate()
    方法中,因为此方法甚至在启动程序活动的
    onCreate()
    方法之前被调用。当您在应用程序中使用
    TaskStackBuilder
    创建活动的合成堆栈以跳过某些活动并向前移动时(如使用应用程序内通知时),这也很有用。因此,当您返回到向后移动的启动器活动时,您可能已经在应用程序中的某个位置使用了
    FirebaseDatabase
    实例,并且在这种情况下可能会弹出错误。

    此解决方案适用于我,但不扩展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);
    }
    

    创建将在整个应用程序中使用的应用程序类,并在其中初始化firebase持久性:

    FirebaseHandler类 您可以调用/命名该类,无论您想命名它什么

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

     <application
        android:name=".FirebaseHandler"
        android:allowBackup="true"
        android:icon="@mipmap/app_icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
    
    这将使您的脱机数据保持同步并保持最新状态

    myRef.keepSynced(true);
    

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

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

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

    如果您使用的是Kotlin,那么下面的代码适用于我。我在类的顶部声明为私有成员变量

    private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }
    

    除了Frank的回答之外,您还应该添加一个检查,例如
    savedInstanceState==null
    ,以确保在活动重新启动时不会再次执行该语句。否则,旋转设备时会出现异常。我尝试了此操作,反复出现以下异常致命异常:主进程:co.transportsystems.offrie:background\u crash,PID:27025 java.lang.RuntimeException:无法创建应用程序com.android.tools.fd.runtime.bootstrap应用程序:java.lang.IllegalStateException:名为[DEFAULT]的FirebaseApp不存在。你知道为什么会这样吗?这对我很有用。。。Thanx siddhesh+1从我这边。除此之外,如果您已经在应用程序标签上为另一个应用程序类使用了
    android:name
    ,并且您无法更改它(就像使用MultiDexApplication来配置应用程序,使用超过64K的方法一样)你可以让MyFirebaseApp扩展这个类。这对我来说很有效,而且似乎是一条出路。谢谢firebase团队对此问题是否有最佳做法?我看到你对这个问题给出了2到3个不同的答案。你能给我们指出一个最佳实践吗?由于某种原因,刚刚再次使用它,所以使用它的风险由你自己承担。
    if (FirebaseApp.getApps(this).size() == 0)
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    
    private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }