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();
Quelque chose comme ça (iirc):
if (mDatabase == null) {
FirebaseDatabase database = FirebaseDatabase.getInstance();
database.setPersistenceEnabled(true);
mDatabase = database.getReference();
// ...
}
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:
Par exemple
class MyFirebaseApp extends Android.app.Application
@Override
public void onCreate() {
super.onCreate();
/* Enable disk persistence */
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
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é.
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
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);
}
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.
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.
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);