com.google.firebase.database.DatabaseException: Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance
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
- 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);
}
- 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.
Something like this (iirc):
if (mDatabase == null) {
FirebaseDatabase database = FirebaseDatabase.getInstance();
database.setPersistenceEnabled(true);
mDatabase = database.getReference();
// ...
}
Create an application class that will be used across your entire application and initialize firebase Persistence in it:
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