2016-06-10 3 views
12

Ich habe ein Problem, wenn ich versuche, Persistenz in fIREBASE zu setzen, kann jemand bitte erklären, wie man vorgeht es,com.google.firebase.database.DatabaseException: Aufrufe von setPersistenceEnabled() müssen vor jeder anderen Verwendung der FirebaseDatabase Instanz ausgeführt werden

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

Neben Frank Antwort, sollten Sie einen Scheck, zum Beispiel 'savedInstanceState == null' hinzufügen, um sicherzustellen, dass die Anweisung nicht wieder auf die Aktivität Neustart ausgeführt wird . Andernfalls erhalten Sie die Ausnahme, wenn Sie das Gerät drehen. –

Antwort

12

Etwas Ähnliches (iirc):

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

hat das Firebase-Team eine Best Practice für diese Ausgabe Frank? Ich habe gesehen, dass Sie zwei oder drei verschiedene Antworten auf diese Frage geben. Können Sie uns bitte auf eine Best Practice hinweisen? – drod

53

nach Firebase Documenta setPersistenceEnabled ist nur einmal aufgerufen werden (vor allen anderen Fällen von FirebaseDatabase gemacht werden)

So ist die Lösung für mich zu diesem Thema war die folgende

  1. Sie benötigen einen Klasse erstellen die android.app.Application und setPersistenceEnabled (true) dort erstreckt.

Für Beispiel

class MyFirebaseApp extends android.app.Application 

@Override 
public void onCreate() { 
    super.onCreate(); 
    /* Enable disk persistence */ 
    FirebaseDatabase.getInstance().setPersistenceEnabled(true); 
} 
  1. Im Manifest, verbinden die MyFirebaseApp Klasse der Anwendung Tag

Für Beispiel

Fügen Sie in Ihrem Anwendungs-Tag folgende

hinzu
android:name="com.example.MyFirebaseApp" 

sollte dies gut funktionieren.

Verwenden Sie in anderen Aktivitäten auch setPersistenceEnabled nicht.

+9

Dies sollte die richtige Antwort sein. – Makalele

+0

Ich versuchte dies und ich bekomme die folgende Ausnahme wiederholt FATAL AUSNAHME: Haupt Prozess: co.transportsystems.offrie: background_crash, PID: 27025 java.lang.RuntimeException: Kann Anwendung com.android.tools.fd erstellen. runtime.BootstrapApplication: java.lang.IllegalStateException: FirebaseApp mit dem Namen [DEFAULT] ist nicht vorhanden. Irgendwelche Ideen, warum das passiert? –

+0

Das funktionierte für mich ... Danke Siddhesh .. +1 von meiner Seite. –

3

Fügen Sie einfach diese an der Spitze der Aktivitätsklasse:

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

für mich gearbeitet, nicht sicher, ob es aber die beste Praxis ist.

+0

Habe gerade einen Absturz mit diesem aus irgendeinem Grund wieder, so verwenden Sie auf eigene Gefahr. – zarsky

2

Wenn Sie eine ContentProvider in Ihrer Anwendung erweitern können Sie FirebaseDatabase.getInstance().setPersistenceEnabled(true); in Ihrem ContentProvider ‚s onCreate() Methode aufrufen, da diese Methode schon vor dem onCreate() Methode des Launchers Aktivität aufgerufen wird. Dies ist auch nützlich, wenn Sie in Ihrer App TaskStackBuilder verwenden, um einen synthetischen Stapel von Aktivitäten zu erstellen, mit dem Sie einige Aktivitäten überspringen und wie bei der Verwendung von App-Benachrichtigungen weitermachen können. Wenn Sie also zurück zur Launcher-Aktivität zurückkehren, haben Sie möglicherweise bereits FirebaseDatabase Instanz irgendwo in Ihrer Anwendung verwendet und der Fehler, den Sie bekommen, könnte auch in diesem Fall auftauchen.

1

Diese Lösung funktioniert für mich ohne erweitert android.app.Anwendung

private static FirebaseDatabase firebaseDatabase; 

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

ODER

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