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

我在 fIREBASE 中尝试设置 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):

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

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

所以对我来说这个问题的解决方案如下

  1. 您需要创建一个 class 扩展 android.app.ApplicationsetPersistenceEnabled( true) 那边.

例如

class MyFirebaseApp extends android.app.Application 

@Override
public void onCreate() {
    super.onCreate();
    /* Enable disk persistence  */
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
  1. Manifest, link MyFirebaseApp class 应用标签

例如

在您的应用程序标签中添加以下内容

android:name="com.example.MyFirebaseApp"

这应该可以正常工作。

也不要在任何其他 Activity.

中使用 setPersistenceEnabled

只需将此添加到您的 activity class:

的顶部
static {
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}

对我有用,但不确定这是否是最佳做法。

如果您在应用中扩展 ContentProvider,您可以调用 FirebaseDatabase.getInstance().setPersistenceEnabled(true); 在你的 ContentProvideronCreate() 方法中,因为这个方法甚至在你的启动器 activity 的 onCreate() 方法之前被调用。当您在应用程序中使用 TaskStackBuilder 创建活动的合成堆栈以跳过某些活动并继续前进时,这也很有用,就像您在应用程序通知中使用时一样。因此,当您返回到启动器 activity 向后移动时,您可能已经在应用程序中的某处使用了 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);
}

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

这是一个例子:

FirebaseHandler class

你可以call/name给class任何你想给它起的名字

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

将应用程序 class 添加到您的 Manifest:

 <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);

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

您可以尝试在调用 setPersistenceEnabled.

之前检查是否有任何已初始化的 firebase 应用程序
if (FirebaseApp.getApps(this).size() == 0)
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);

如果您使用的是 Kotlin,则以下代码对我有用。我在 class.

的顶部声明为私有成员变量
private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }

这对我有用。将此添加到您的 launching activity!

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