web-dev-qa-db-fra.com

Obtenir des informations sur la base de données en temps réel Firebase avec le SDK d’administrateur Firebase

J'essaie d'obtenir des informations de la base de données Firebase Real-time sans succès. Je ne sais pas ce que je fais mal. J'ai aussi essayé l'exemple de la doc et ils n'ont pas fonctionné. Voici mon code et ma structure de base de données firebase:

Database structure

Topics.Java:

public class Topics {

 private String name;

 public Topics() {

 }

 public Topics(String name) {
    this.name = name;
 }

 public String getName() {
    return name;
 }

 public void setName(String name) {
    this.name = name;
 }

}

Main.Java

public static void main(String[] args) {
    // TODO Auto-generated method stub
    FileInputStream serviceAccount;
    FirebaseOptions options = null;
    try {
        serviceAccount = new FileInputStream(".//...");
        options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("...")
                .build();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch(IOException e) {
        e.printStackTrace();
    }

    FirebaseApp.initializeApp(options);
    String topics = getDatafromFirebase();

    System.out.println("Everything right!");
}

private static String getDatafromFirebase() {
    CountDownLatch done = new CountDownLatch(1);
    StringBuilder b = new StringBuilder();
    DatabaseReference dbRef = FirebaseDatabase.getInstance()
            .getReference();

    dbRef.child("topics").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            // TODO Auto-generated method stub
            if(snapshot.exists()) {
                for(DataSnapshot s:snapshot.getChildren()) {
                    Topics t = s.getValue(Topics.class);
                    b.append(t.getName());
                    b.append(" ");
                    done.countDown();
                }
            }
            else {
                b.append("No existe ");
                done.countDown();
            }

        }

        @Override
        public void onCancelled(DatabaseError error) {
            // TODO Auto-generated method stub
            b.append("Error: "+error.getDetails());
            done.countDown();
        }
        });
    try {
        done.await();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return b.toString();
}

J'ai attendu la CountDownLatch pendant __codes5+, ce qui me semble suffisamment de temps pour le déclencher. En outre, remarque importante: j'ai envoyé un message avec succès via la messagerie en nuage Firebase, je ne pense donc pas que le problème soit lié aux informations d'identification.

12
Emmanuel Guerra

J'ai exécuté votre code sur ma base de données avec la même structure de base de données et je peux certainement affirmer que je suis en mesure d'obtenir des informations à partir de la base de données.

Le point d'arrêt onDataChange non déclenché ne se produit que si je supprime entièrement le sous-arbre topics. c'est à dire. dans votre cas, une base de données vide.

Je soupçonne l’URL de votre base de données ou votre clé privée JSON.

Suivez les instructions ci-dessous pour une nouvelle clé privée.

  1. Dans la console, cliquez sur l'icône engrenage à gauche, puis sur l'onglet Comptes de serviceVoir

  2. Prenez note de databaseUrl et cliquez sur Générer une nouvelle clé privée, enregistrez-la . Référez-vous

Voici le code de travail par exemple

package fireb;

import Java.io.FileInputStream;
import Java.io.FileNotFoundException;
import Java.io.IOException;
import Java.util.concurrent.CountDownLatch;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;


public class Fireb {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileInputStream serviceAccount;
        FirebaseOptions options = null;
        try {
            serviceAccount = new FileInputStream("C:\\key\\testapp-f0fe2-firebase-adminsdk-4po4a-5ce6c60b81.json");
            options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .setDatabaseUrl("https://testapp-f0fe2.firebaseio.com")
                    .build();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        }

        FirebaseApp.initializeApp(options);
        String topics = getDatafromFirebase();
        System.out.println(topics);
        System.out.println("Everything right!");
    }

    private static String getDatafromFirebase() {
        CountDownLatch done = new CountDownLatch(1);
        StringBuilder b = new StringBuilder();
        DatabaseReference dbRef = FirebaseDatabase.getInstance()
                .getReference();

        dbRef.child("topics").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                // TODO Auto-generated method stub
                if(snapshot.exists()) {
                    for(DataSnapshot s:snapshot.getChildren()) {
                        Topics t = s.getValue(Topics.class);
                        b.append(t.getName());
                        b.append(" ");
                    }
                    done.countDown();
                }
                else {
                    b.append("No existe ");
                    done.countDown();
                }

            }

            @Override
            public void onCancelled(DatabaseError error) {
                // TODO Auto-generated method stub
                b.append("Error: "+error.getDetails());
                done.countDown();
            }
            });
        try {
            done.await();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return b.toString();
    }
}
1
Jaikanth J

Selon la documentation disponible ici

Avant de pouvoir accéder à la base de données en temps réel Firebase à partir d'un serveur utilisant le SDK d'administration de Firebase, vous devez authentifier votre serveur avec Firebase. Lorsque vous authentifiez un serveur plutôt que de vous connecter avec les informations d'identification d'un compte utilisateur comme dans une application client, vous vous authentifiez avec un compte de service qui identifie votre serveur auprès de Firebase.

Si vous n'exécutez pas votre code sur le serveur, vous pouvez vous authentifier en tant que client à la place décrite ici .

J'espère que cela t'aides.

0
m__