2017-02-10 6 views
0

Ich versuche, Daten von Firebase über Java zu lesen. Die addListenerForSingleValueEvent und alles, was ich hineinlege, wird nicht ausgeführt. Nachdem ich andere verwandte Stack-Fragen durchsucht habe, konnte ich keine Antwort finden, die nicht mit Android zusammenhängt. Bitte werfen Sie einen Blick und lassen Sie mich wissen, warum diese Methode nicht ausgeführt wird. Danke im Voraus.addListenerForSingleValueEvent führt nicht

import com.google.firebase.FirebaseApp; 
import com.google.firebase.FirebaseOptions; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.ValueEventListener; 
import java.io.*; 

public class App { 

    public static void main(String[] args) { 

     class ServiceFile { 

      private FileInputStream mMyFile; 

      public ServiceFile(String myFile) { 
       try { 
        mMyFile = new FileInputStream(myFile); 
        System.out.println("The Service File exists. "); // this line prints 
       } catch (FileNotFoundException ex) { 
        System.out.println("The Service File does not exist."); 
       } 
      } 

      public FileInputStream getMyFile() { 
       return mMyFile; 
      } 
     } 

     ServiceFile serviceFile = new ServiceFile("/Users/xxxx/Documents/development/javaFire/serviceAccountKey.json"); 

     FirebaseOptions options = new FirebaseOptions.Builder() 
       .setServiceAccount(serviceFile.getMyFile()) 
       .setDatabaseUrl("https://xxxx.firebaseio.com") 
       .build(); 

     // Initialize the app 
     FirebaseApp myApp = FirebaseApp.initializeApp(options); 

     // Get the reference to some location within the DB 
     final FirebaseDatabase database = FirebaseDatabase.getInstance(myApp); 
     DatabaseReference ref = database.getReference("https://stackoverflow.com/users/john"); 

     // Attach a listener to read the data at the DB reference 
     ref.addListenerForSingleValueEvent(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot theData) { 
       System.out.println("Success! "); // this line does not print 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       System.out.println("Cancelled" + databaseError.getMessage()); // this line does not print 
      } 
     }); 

    } 

} 

Meine Datenbank Regeln sind als solche:

{ 
    "rules": { 
    ".read": true, 
    ".write": "auth != null" 
    } 
} 

in Firebase Meine Daten, bei /users.json

{ 
    "john": { 
    "dob": "02/20/1980" 
    } 
} 

Antwort

0

Es sieht aus wie Ihr Rückruf, weil Ihr Programm endet nicht ausgeführt wird bevor der Callback neue Daten empfangen kann. Denken Sie daran, dass addListenerForSingleValueEvent asynchron ist (es wird sofort zurückgegeben), so dass Ihre Hauptfunktion sofort zurückkehrt, was bedeutet, dass die JVM beendet wird.

Zumindest können Sie am Ende der Funktion Thread.sleep() aufrufen, um sicherzustellen, dass es nicht sofort beendet wird. Aber für ein echtes Programm werden Sie wahrscheinlich etwas anderes tun.

+0

Dank Doug, Hinzufügen einer Wartezeit von 1 Sekunde erlaubte dem Programm, Daten vor dem Verlassen zu erhalten - und druckte den "Erfolg!" Botschaft. Haben Sie Strategien/Empfehlungen/Ressourcen, die andere Lösungen ansprechen? – caleb

+0

Asynchrone Vorgänge in Firebase geben ein Task-Objekt zurück. Sie könnten lernen, diese zu benutzen. Ich habe eine ganze Blog-Serie über sie hier beginnend: https://firebase.googleblog.com/2016/09/become-a-firebase-taskmaster-part-1.html –

Verwandte Themen