web-dev-qa-db-fra.com

com.google.firebase.database.DatabaseException: les appels à setPersistenceEnabled () doivent être effectués avant toute autre utilisation de l'instance FirebaseDatabase.

Je rencontre un problème lorsque j'essaie de définir la persistance dans FIREBASE. Quelqu'un peut-il expliquer s'il

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();
22
Vincent Macharia

Quelque chose comme ça (iirc):

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

Selon Firebase Documentations, setPersistenceEnabled doit être appelé une seule fois (avant toute autre instance de FirebaseDatabase).

La solution à ce problème était donc la suivante: 

  1. Vous devez créer une classe qui étend Android.app.Application et setPersistenceEnabled (true) là-bas.

Par exemple

class MyFirebaseApp extends Android.app.Application 

@Override
public void onCreate() {
    super.onCreate();
    /* Enable disk persistence  */
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
  1. Dans le Manifest , liez la classe MyFirebaseApp à la balise d'application 

Par exemple

dans votre balise d'application, ajoutez ce qui suit

Android:name="com.example.MyFirebaseApp"

cela devrait bien fonctionner. 

N'utilisez pas non plus setPersistenceEnabled dans aucune autre activité.

83
Siddhesh Dighe

Créez une classe d'application qui sera utilisée dans l'ensemble de votre application et initialisez-y la persistance de Firebase:

Classe FirebaseHandlerVous pouvez appeler/nommer la classe comme vous le souhaitez

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

Ajoutez la classe d'application à votre Manifest:

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

De cette manière, la persistance des données sera appliquée à l'ensemble de votre projet . Afin d'appliquer la persistance du disque à des données spécifiques.

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

Ceci maintiendra vos données hors ligne synchronisées et à jour

myRef.keepSynced(true);

En savoir plus sur la persistance du disqueici

8
RileyManda

Cette solution fonctionne pour moi sans les extensions Android.app.Application

private static FirebaseDatabase firebaseDatabase;

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

OU

if (savedInstanceState == null) {
   FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
4
Vishal G. Gohel

Ajoutez simplement ceci en haut de votre classe d'activité:

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

Travaillé pour moi, pas sûr si c'est la meilleure pratique cependant.

4
zarsky

Si vous étendez une ContentProvider dans votre application, vous pouvez appeler FirebaseDatabase.getInstance().setPersistenceEnabled(true);dans votre méthode ContentProvider's onCreate() car cette méthode est appelée même avant la méthode onCreate() de votre activité de lanceur. Cela sera également utile lorsque vous utiliserez TaskStackBuilder dans votre application pour créer une pile synthétique d’activités permettant d’ignorer certaines activités et d’avancer comme dans les notifications d’application. Ainsi, lorsque vous revenez à l'activité de lanceur en arrière, vous avez peut-être déjà utilisé une instance FirebaseDatabase quelque part dans votre application et l'erreur que vous obtenez peut également apparaître dans ce cas.

3
Kartik Watwani

Vous pouvez essayer de vérifier s'il existe des applications Firebase initialisées avant d'appeler setPersistenceEnabled.

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