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:
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.
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.
Dans la console, cliquez sur l'icône engrenage à gauche, puis sur l'onglet Comptes de serviceVoir
Prenez note de databaseUrl et cliquez sur Générer une nouvelle clé privée, enregistrez-la . Référez-vous
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();
}
}
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.