Rufen Sie die Firebase-Datenbank von Google App Engine auf

8

Ich habe dieses Tutorial zur Einrichtung meiner Google App Engine-Instanz und von Ich benutze Firebase. Mein Ziel ist es, die gesamte "Berechnung" auf Google App Engine zu setzen. Ich möchte eine Funktion wie die folgende nennen:

MeinEndpunkt:

%Vor%

HauptAktivität:

%Vor%

Ich verstehe, dass der obige Code für Firebase Android-spezifisch ist, sodass das Ausführen auf einer Google App Engine-Instanz nicht funktioniert. Ich habe mich gefragt, ob jemand CRUD ausführen kann Vorgänge in einer Firebase-Datenbank im Google App Engine-Back-End. Jede Hilfe wird geschätzt.

    
booky99 18.06.2016, 01:07
quelle

1 Antwort

11

Sie müssen das Firebase Server SDK verwenden, um serverseitige Aufrufe durchzuführen. Informationen zum Einrichten und Verwenden finden Sie hier:

Fügen Sie Firebase zu Ihrem Server hinzu

Firebase Server SDK Installation & amp; Einrichtung

Beachten Sie bei der Verwendung von Firebase mit Google Cloud Endpoints, dass Sie Firebase-Methoden in Verbindung mit Aufgaben API . Da Firebase-Methoden nicht blockiert werden, kehrt Ihr Endpunkt zurück, wenn Sie keine Aufgaben verwenden, bevor der Anruf, den Sie an Firebase gesendet haben, eine Chance hat, sein Ergebnis zurückzugeben. Eine kurze Einführung in die Verwendung von Aufgaben finden Sie unter dem folgenden Link. Es ist eine Rede auf Google I / O 2016. Der Redner spricht über Aufgaben und Firebase auf Android, aber die Konzepte sind die gleichen, wenn Sie Aufgaben und Firebase auf einem Server verwenden. Beachten Sie, dass sie die Aufgaben-API mit dem Firebase Server SDK enthalten haben. Ich habe auf den Teil des Vortrags verzichtet, der sich direkt mit Aufgaben beschäftigt.

Firebase SDK für Android: Ein Tech-Tieftauchgang

Die folgenden Beispiele zeigen, ob Sie das Ergebnis Ihrer Firebase-Lese- / Schreiboperation verarbeiten müssen, bevor Ihr Endpunkt einen Wert zurückgibt oder ob anderer Code vom Ergebnis der Firebase-Lese- / Schreiboperation abhängt. Dies sind serverseitige Beispiele. Ich nehme an, Sie interessieren sich, ob der Schreibvorgang erfolgreich war oder nicht. Möglicherweise gibt es bessere Möglichkeiten, diese serverseitigen Operationen durchzuführen, aber das ist, was ich bisher getan habe.

Beispiel einer Schreiboperation mit setValue ():

%Vor%
  1. Wenn ein Aufruf an die Methode setValue() erfolgt, wird ein Task -Objekt zurückgegeben und ein Verweis darauf beibehalten.

    %Vor%
  2. Erstellen Sie ein TaskCompletionSource -Objekt. Dieses Objekt sollte mit dem gewünschten Ergebnistyp parametrisiert werden. Ich werde Boolean als Ergebnistyp für dieses Beispiel verwenden.

    %Vor%
  3. Erzeuge ein Task aus dem TaskCompletionSource , das in Schritt 2 erstellt wurde. Auch hier sollte das generierte Task den gleichen Parametertyp wie das TaskCompletionSource Objekt verwenden.

    %Vor%
  4. Fügen Sie der Task , die durch den Aufruf von setValue() generiert wurde, einen Abschluss-Listener hinzu. Setzen Sie im Completion-Listener das entsprechende Ergebnis für das in Schritt 3 erstellte Task . Wenn Sie setResult() auf Ihrem TaskCompletionSouce -Objekt aufrufen, wird das daraus erstellte Task als abgeschlossen markiert. Dies ist wichtig für Schritt 5.

    %Vor%
  5. Rufen Sie Task.await() auf, um den aktuellen Thread zu blockieren, bis der Task , an dem Sie interessiert sind, abgeschlossen ist. Wir warten darauf, dass das vom Objekt Task generierte TaskCompletionSource als abgeschlossen markiert wird. Dieser Task wird als abgeschlossen betrachtet, wenn wir setResult() auf dem TaskCompletionSource aufrufen, um den Task wie in Schritt 4 zu generieren. Nach Abschluss wird das Ergebnis zurückgegeben.

    %Vor%

Das ist es, der aktuelle Thread wird blockiert, bis Tasks.await() einen Wert zurückgibt. Sie können (und sollten) auch einen Zeitüberschreitungswert für die Methode Tasks.await() festlegen, wenn Sie verhindern möchten, dass der aktuelle Thread auf unbestimmte Zeit blockiert wird.

Wenn Sie nur daran interessiert waren, ob das von Task generierte setValue() abgeschlossen war und es nicht wichtig war, ob es erfolgreich war oder nicht, dann können Sie die Erstellung von TaskCompletionSource überspringen und einfach Tasks.await() verwenden direkt auf dem Task . Das gleiche funktioniert für updateChildren() . Und wenn Sie möchten, können Sie einfach die Methodenaufrufe für updateChilden() oder setValue() verwenden, die ein DatabaseReference.CompletionListener zusammen mit einem TaskCompletionListener verwenden.

Das Warten auf eine Leseoperation ist ähnlich.

Beispiellesevorgang mit addListenerForSingleValueEvent ()

%Vor%
  1. Erstellen Sie ein TaskCompletionSource Objekt, parametrisiert mit dem Ergebnis, das Sie von der Task erwarten, die daraus generiert wird.

    %Vor%
  2. Erzeuge Task vom Objekt TaskCompletionSource

    %Vor%
  3. Rufen Sie addListenerForSingleValueEvent() für% code_% auf und rufen Sie DatabaseReference für die in Schritt 2 generierte setResult() auf.

    %Vor%
  4. Rufen Sie Task auf, um den aktuellen Thread zu blockieren, bis der Tasks.await() , an dem Sie interessiert sind, abgeschlossen ist. Der Task wird als abgeschlossen betrachtet, wenn wir wie in Schritt 3 Task aufrufen und das Ergebnis zurückgeben.

    %Vor%

Wie oben erwähnt, können Sie die Methode setResult() zusammen mit einem Zeitüberschreitungswert verwenden, um zu verhindern, dass der aktuelle Thread auf unbestimmte Zeit blockiert wird.

Genau wie ein Heads-Up habe ich festgestellt, dass Firebase den Hintergrund-Thread, der für seine Operationen verwendet wird, nicht beendet. Dies bedeutet, dass die GAE-Instanz niemals inaktiv ist. Sieh dir diesen Thread für weitere Informationen an:

Firebase, Hintergrund-Threads und App Engine

    
Kevin O'Neil 18.06.2016, 04:48
quelle