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

Vin*_*ria 27 android firebase firebase-realtime-database

当我尝试在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();
Run Code Online (Sandbox Code Playgroud)

Sid*_*ghe 87

根据Firebase Documentations,setPersistenceEnabled仅被调用一次(在FirebaseDatabase的任何其他实例之前)

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

  1. 您需要创建一个,其扩展android.app.ApplicationsetPersistenceEnabled(真)那边.

例如

class MyFirebaseApp extends android.app.Application 

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

例如

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

android:name="com.example.MyFirebaseApp"
Run Code Online (Sandbox Code Playgroud)

这应该工作正常.

也不要在任何其他Activity中使用setPersistenceEnabled.

  • 除此之外,如果你已经在应用程序标签上使用`android:name`作为另一个Application类而且你无法改变它(比如使用MultiDexApplication来配置应用程序,就像我正在做的那样超过64K的方法)你可以make MyFirebaseApp扩展该类. (3认同)

Fra*_*len 17

像这样的东西(iirc):

 if (mDatabase == null) {
     FirebaseDatabase database = FirebaseDatabase.getInstance();
     database.setPersistenceEnabled(true);
     mDatabase = database.getReference();
     // ...
 }
Run Code Online (Sandbox Code Playgroud)

  • firebase团队是否有针对此问题的最佳实践Frank?我见过你为这个问题提供2或3个不同的答案.你能指点我们最好的做法吗? (4认同)

Ril*_*nda 10

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

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

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

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

 <application
    android:name=".FirebaseHandler"
    android:allowBackup="true"
    android:icon="@mipmap/app_icon"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
Run Code Online (Sandbox Code Playgroud)

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

DatabaseReference myRef=FirebaseDatabase.getInstance().getReference("people"); 
myRef.keepSynced(true);
Run Code Online (Sandbox Code Playgroud)

这将使您的离线数据保持同步并保持最新状态

myRef.keepSynced(true);
Run Code Online (Sandbox Code Playgroud)

了解更多关于磁盘持久 这里


Vis*_*hel 6

此解决方案对我有效,无需扩展android.app.Application

private static FirebaseDatabase firebaseDatabase;

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

要么

if (savedInstanceState == null) {
   FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)


zar*_*sky 5

只需将其添加到活动类的顶部即可:

static {
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

为我工作,但不确定这是否是最佳做法。