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

17,197

Solution 1

Something like this (iirc):

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

Solution 2

According to Firebase Documentations setPersistenceEnabled is to be called only once (before any other instances of FirebaseDatabase are made)

So the solution to this issue for me was the following

  1. You need to create a class which extends android.app.Application and setPersistenceEnabled(true) over there.

For Example

class MyFirebaseApp extends android.app.Application 

@Override
public void onCreate() {
    super.onCreate();
    /* Enable disk persistence  */
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
  1. In the Manifest, link the MyFirebaseApp class to the application tag

For Example

in your application tag add the following

android:name="com.example.MyFirebaseApp"

this should work fine.

Also don't use setPersistenceEnabled in any other Activity.

Solution 3

Create an application class that will be used across your entire application and initialize firebase Persistence in it: The Class should extend Application.( ClassName extends Application):

Heres An Example:

FirebaseHandler class

You can call/name the class whatever you want to name it

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

Add the application class to your Manifest:

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

This way data persistance will be applied to your entire project. Inorder to apply disk persistence to specific data.

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

This will keep your offline data synced and up to date

myRef.keepSynced(true);

Learn more about Disk Persistence Here

Solution 4

This solution works for me without extends android.app.Application

private static FirebaseDatabase firebaseDatabase;

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

OR

if (savedInstanceState == null) {
   FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}

Solution 5

Just add this at the top of your activity class:

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

Worked for me, not sure if it's the best practice though.

Share:
17,197
Vincent Macharia
Author by

Vincent Macharia

Updated on June 02, 2022

Comments

  • Vincent Macharia
    Vincent Macharia about 2 years

    I am having a problem when I try to setPersistence in fIREBASE,can someone please explain on how to go about it,

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